|''URL:''|http://tiddlywiki.abego-software.de/|
!Welcome to your ''tiddlyspot.com'' ~TiddlyWiki!\n''[[tiddlyspot.com|http://tiddlyspot.com]]'' gives you an instant [[TiddlyWiki|http://tiddlywiki.com]] hosted on our ''tiddlyspot.com'' servers.\n\nWant to work online? No problem, you can go to your ''tiddlyspot.com'' URL (which is http://tiddlyspot.com/mptw-beta/ ) and start editing. Click "save to web" and your changes are saved directly to your ''tiddlyspot.com'' home -- no messing about with local files or ftp.\n\nWant to work offline? No problem, your ''tiddlyspot.com'' ~TiddlyWiki is a real, fully functioning ~TiddlyWiki that you can save onto your hard drive or USB stick. Use the link below to save to your local computer. As you make changes, use the "save to disk" button to save to your local file. Whenever you're ready to sync up again, just click "save to web".\n\n!To save online\nEnter the upload password provided when you created your ~TiddlyWiki. Then click the "save to web" button below (or in the right side column) to save your ~TiddlyWiki.\nUpload Password: <<option pasUploadPassword>>\n<<upload http://mptw-beta.tiddlyspot.com/store.cgi index.html . . mptw-beta>>\n\n!To save offline\nTo take this ~TiddlyWiki offline, click [[Download|http://tiddlyspot.com/?action=download&site=mptw-beta]]. Save the file locally then open it in your browser.\n\n\n!Learn more about ~TiddlyWiki\nFind out more about ~TiddlyWiki at [[TiddlyWiki.com|http://tiddlywiki.com]]. Also visit [[TiddlyWiki Guides|http://tiddlywikiguides.org]] for documentation on learning and using ~TiddlyWiki.\n\nThe [[TiddlyWiki mailing list|http://groups.google.com/group/TiddlyWiki]] is an excellent place to ask questions and get help.\n\n!Enjoy!\nWe hope you like using your ''tiddlyspot.com'' ~TiddlyWiki. Please email [[feedback@tiddlyspot.com|mailto:feedback@tiddlyspot.com]] with any comments.\n\n----
config.options.chkHttpReadOnly = false;
Background: #ffc\nForeground: #000\nPrimaryPale: #fc8\nPrimaryLight: #f81\nPrimaryMid: #b40\nPrimaryDark: #410\nSecondaryPale: #ffc\nSecondaryLight: #fe8\nSecondaryMid: #db4\nSecondaryDark: #841\nTertiaryPale: #e88\nTertiaryLight: #c66\nTertiaryMid: #944\nTertiaryDark: #633\n
Anything tagged with <<tag css>>, <<tag html>> or <<tag systemConfig>> will be automatically formatted as plain text (unless it has {{{ {{{ }}} in it). Here's how it's done in ViewTemplate:\n{{{\n...\n<div macro="hideWhen tiddler.tags.containsAny(['css','html','pre','systemConfig'])&&!tiddler.text.match('{{'+'{')">\n <div class='viewer' macro='view text wikified'></div>\n</div>\n<div macro="showWhen tiddler.tags.containsAny(['css','html','pre','systemConfig'])&&!tiddler.text.match('{{'+'{')">\n <div class='viewer'><pre macro='view text'></pre></div>\n</div>\n...\n}}}
Yipee!!
|''URL:''|http://tiddlywiki.bidix.info/|
!By Dave Gifford\n\nBackground: #bbbbff\nForeground: #000\nPrimaryPale: #7788ff\nPrimaryLight: #006699\nPrimaryMid: #002244\nPrimaryDark: #000\nSecondaryPale: #ffc\nSecondaryLight: #fe8\nSecondaryMid: #db4\nSecondaryDark: #002244\nTertiaryPale: #7788ff\nTertiaryLight: #aaaaff\nTertiaryMid: #000\nTertiaryDark: #8B7355\n\n
!By Dave Gifford\n\nBackground: #FFFFFF\nForeground: #000\nPrimaryPale: #FF8C69\nPrimaryLight: #FF8C69\nPrimaryMid: #8B4C39\nPrimaryDark: #410\nSecondaryPale: #ffc\nSecondaryLight: #fe8\nSecondaryMid: #db4\nSecondaryDark: #841\nTertiaryPale: #FFD39B\nTertiaryLight: #EEC591\nTertiaryMid: #CDAA7D\nTertiaryDark: #8B7355
Type the text for 'New Tiddler'
Background: #fff\nForeground: #000\nPrimaryPale: #69c\nPrimaryLight: #36a\nPrimaryMid: #025\nPrimaryDark: #012\nSecondaryPale: #ffc\nSecondaryLight: #fe8\nSecondaryMid: #db4\nSecondaryDark: #520\nTertiaryPale: #eee\nTertiaryLight: #ccc\nTertiaryMid: #999\nTertiaryDark: #666\nError: #f88
I like to use HideWhenMacro along with ToggleTagMacro to put useful functions in the toolbar. For example see <<tag Task>>s where I've added a Next and Done checkbox under the title (this is how MonkeyGTD works) and <<tag systemConfig>> tiddlers where I've added a Disable and Force checkbox up near the toolbar. To see how it's done take a look in ViewTemplate. Also notice the new double square bracket syntax for including other tiddlers in templates.
Edit this tiddler and change the colours. The preview to the right will update to match.\nBackground: #000\nForeground: #fff\nPrimaryPale: #f99\nPrimaryLight: #4f4\nPrimaryMid: #99f\nPrimaryDark: #fdd\nSecondaryPale: #ccf\nSecondaryLight: #f3f\nSecondaryMid: #29f\nSecondaryDark: #841\nTertiaryPale: #ff0\nTertiaryLight: #066\nTertiaryMid: #f0f\nTertiaryDark: #444\nError: #f88\n
Several [[Macros]] including the TodayMacro take a DateFormatString as an optional argument. This string can be a combination of ordinary text, with some special characters that get substituted by parts of the date:\n* {{{DDD}}} - day of week in full (eg, "Monday")\n* {{{ddd}}} - short day of week (eg, "Mon")\n* {{{DD}}} - day of month\n* {{{0DD}}} - adds a leading zero\n* {{{DDth}}} - adds a suffix\n* {{{WW}}} - ISO-8601 week number of year\n* {{{0WW}}} - adds a leading zero\n* {{{MMM}}} - month in full (eg, "July")\n* {{{mmm}}} - short month (eg, "Jul")\n* {{{MM}}} - month number\n* {{{0MM}}} - adds leading zero\n* {{{YYYY}}} - full year\n* {{{YY}}} - two digit year\n* {{{wYYYY}}} - full year with respect to week number\n* {{{wYY}}} two digit year with respect to week number\n* {{{hh}}} - hours\n* {{{0hh}}} - adds a leading zero\n* {{{hh12}}} - hours in 12 hour clock\n* {{{0hh12}}} - hours in 12 hour clock with leading zero\n* {{{mm}}} - minutes\n* {{{0mm}}} - minutes with leading zero\n* {{{ss}}} - seconds\n* {{{0ss}}} - seconds with leading zero\n* {{{am}}} or {{{pm}}} - lower case AM/PM indicator\n* {{{AM}}} or {{{PM}}} - upper case AM/PM indicator\n
Edit this to see date picker demo. Any tiddler tagged with <<tag hasDate>> has a date attached to it. Eventually I will incorporate this with EventsDemo. See also RememberThis.
//{{{\n\n\n/**\nThis is a JavaScript library that will allow you to easily add some basic DHTML\ndrop-down datepicker functionality to your Notes forms. This script is not as\nfull-featured as others you may find on the Internet, but it's free, it's easy to\nunderstand, and it's easy to change.\n\nYou'll also want to include a stylesheet that makes the datepicker elements\nlook nice. An example one can be found in the database that this script was\noriginally released with, at:\n\nhttp://www.nsftools.com/tips/NotesTips.htm#datepicker\n\nI've tested this lightly with Internet Explorer 6 and Mozilla Firefox. I have no idea\nhow compatible it is with other browsers.\n\nversion 1.5\nDecember 4, 2005\nJulian Robichaux -- http://www.nsftools.com\n\nHISTORY\n-- version 1.0 (Sept. 4, 2004):\nInitial release.\n\n-- version 1.1 (Sept. 5, 2004):\nAdded capability to define the date format to be used, either globally (using the\ndefaultDateSeparator and defaultDateFormat variables) or when the displayDatePicker\nfunction is called.\n\n-- version 1.2 (Sept. 7, 2004):\nFixed problem where datepicker x-y coordinates weren't right inside of a table.\nFixed problem where datepicker wouldn't display over selection lists on a page.\nAdded a call to the datePickerClosed function (if one exists) after the datepicker\nis closed, to allow the developer to add their own custom validation after a date\nhas been chosen. For this to work, you must have a function called datePickerClosed\nsomewhere on the page, that accepts a field object as a parameter. See the\nexample in the comments of the updateDateField function for more details.\n\n-- version 1.3 (Sept. 9, 2004)\nFixed problem where adding the <div> and <iFrame> used for displaying the datepicker\nwas causing problems on IE 6 with global variables that had handles to objects on\nthe page (I fixed the problem by adding the elements using document.createElement()\nand document.body.appendChild() instead of document.body.innerHTML += ...).\n\n-- version 1.4 (Dec. 20, 2004)\nAdded "targetDateField.focus();" to the updateDateField function (as suggested\nby Alan Lepofsky) to avoid a situation where the cursor focus is at the top of the\nform after a date has been picked. Added "padding: 0px;" to the dpButton CSS\nstyle, to keep the table from being so wide when displayed in Firefox.\n\n-- version 1.5 (Dec 4, 2005)\nAdded display=none when datepicker is hidden, to fix problem where cursor is\nnot visible on input fields that are beneath the date picker. Added additional null\ndate handling for date errors in Safari when the date is empty. Added additional\nerror handling for iFrame creation, to avoid reported errors in Opera. Added\nonMouseOver event for day cells, to allow color changes when the mouse hovers\nover a cell (to make it easier to determine what cell you're over). Added comments\nin the style sheet, to make it more clear what the different style elements are for.\n*/\n\nvar datePickerDivID = "datepicker";\nvar iFrameDivID = "datepickeriframe";\n\nvar dayArrayShort = new Array('Su', 'Mo', 'Tu', 'We', 'Th', 'Fr', 'Sa');\nvar dayArrayMed = new Array('Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat');\nvar dayArrayLong = new Array('Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday');\nvar monthArrayShort = new Array('Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec');\nvar monthArrayMed = new Array('Jan', 'Feb', 'Mar', 'Apr', 'May', 'June', 'July', 'Aug', 'Sept', 'Oct', 'Nov', 'Dec');\nvar monthArrayLong = new Array('January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December');\n \n// these variables define the date formatting we're expecting and outputting.\n// If you want to use a different format by default, change the defaultDateSeparator\n// and defaultDateFormat variables either here or on your HTML page.\nvar defaultDateSeparator = "/"; // common values would be "/" or "."\nvar defaultDateFormat = "mdy" // valid values are "mdy", "dmy", and "ymd"\nvar dateSeparator = defaultDateSeparator;\nvar dateFormat = defaultDateFormat;\n\n/**\nThis is the main function you'll call from the onClick event of a button.\nNormally, you'll have something like this on your HTML page:\n\nStart Date: <input name="StartDate">\n<input type=button value="select" onclick="displayDatePicker('StartDate');">\n\nThat will cause the datepicker to be displayed beneath the StartDate field and\nany date that is chosen will update the value of that field. If you'd rather have the\ndatepicker display beneath the button that was clicked, you can code the button\nlike this:\n\n<input type=button value="select" onclick="displayDatePicker('StartDate', this);">\n\nSo, pretty much, the first argument (dateFieldName) is a string representing the\nname of the field that will be modified if the user picks a date, and the second\nargument (displayBelowThisObject) is optional and represents an actual node\non the HTML document that the datepicker should be displayed below.\n\nIn version 1.1 of this code, the dtFormat and dtSep variables were added, allowing\nyou to use a specific date format or date separator for a given call to this function.\nNormally, you'll just want to set these defaults globally with the defaultDateSeparator\nand defaultDateFormat variables, but it doesn't hurt anything to add them as optional\nparameters here. An example of use is:\n\n<input type=button value="select" onclick="displayDatePicker('StartDate', false, 'dmy', '.');">\n\nThis would display the datepicker beneath the StartDate field (because the\ndisplayBelowThisObject parameter was false), and update the StartDate field with\nthe chosen value of the datepicker using a date format of dd.mm.yyyy\n*/\nfunction displayDatePicker(dateFieldName, displayBelowThisObject, dtFormat, dtSep)\n{\n // var targetDateField = document.getElementByName(dateFieldName).item(0);\n var targetDateField = document.getElementById(dateFieldName); // mptw edit\n \n // if we weren't told what node to display the datepicker beneath, just display it\n // beneath the date field we're updating\n if (!displayBelowThisObject)\n displayBelowThisObject = targetDateField;\n \n // if a date separator character was given, update the dateSeparator variable\n if (dtSep)\n dateSeparator = dtSep;\n else\n dateSeparator = defaultDateSeparator;\n \n // if a date format was given, update the dateFormat variable\n if (dtFormat)\n dateFormat = dtFormat;\n else\n dateFormat = defaultDateFormat;\n \n var x = displayBelowThisObject.offsetLeft;\n var y = displayBelowThisObject.offsetTop + displayBelowThisObject.offsetHeight ;\n \n // deal with elements inside tables and such\n var parent = displayBelowThisObject;\n while (parent.offsetParent) {\n parent = parent.offsetParent;\n x += parent.offsetLeft;\n y += parent.offsetTop ;\n }\n \n drawDatePicker(targetDateField, x, y);\n}\n\n\n/**\nDraw the datepicker object (which is just a table with calendar elements) at the\nspecified x and y coordinates, using the targetDateField object as the input tag\nthat will ultimately be populated with a date.\n\nThis function will normally be called by the displayDatePicker function.\n*/\nfunction drawDatePicker(targetDateField, x, y)\n{\n var dt = getFieldDate(targetDateField.value);\n \n // the datepicker table will be drawn inside of a <div> with an ID defined by the\n // global datePickerDivID variable. If such a div doesn't yet exist on the HTML\n // document we're working with, add one.\n if (!document.getElementById(datePickerDivID)) {\n // don't use innerHTML to update the body, because it can cause global variables\n // that are currently pointing to objects on the page to have bad references\n //document.body.innerHTML += "<div id='" + datePickerDivID + "' class='dpDiv'></div>";\n var newNode = document.createElement("div");\n newNode.setAttribute("id", datePickerDivID);\n newNode.setAttribute("class", "dpDiv");\n newNode.setAttribute("style", "visibility: hidden;");\n document.body.appendChild(newNode);\n }\n \n // move the datepicker div to the proper x,y coordinate and toggle the visiblity\n var pickerDiv = document.getElementById(datePickerDivID);\n pickerDiv.style.position = "absolute";\n pickerDiv.style.left = x + "px";\n pickerDiv.style.top = y + "px";\n pickerDiv.style.visibility = (pickerDiv.style.visibility == "visible" ? "hidden" : "visible");\n pickerDiv.style.display = (pickerDiv.style.display == "block" ? "none" : "block");\n pickerDiv.style.zIndex = 10000;\n \n // draw the datepicker table\n refreshDatePicker(targetDateField.id, dt.getFullYear(), dt.getMonth(), dt.getDate());\n}\n\n\n/**\nThis is the function that actually draws the datepicker calendar.\n*/\nfunction refreshDatePicker(dateFieldName, year, month, day)\n{\n // if no arguments are passed, use today's date; otherwise, month and year\n // are required (if a day is passed, it will be highlighted later)\n var thisDay = new Date();\n \n if ((month >= 0) && (year > 0)) {\n thisDay = new Date(year, month, 1);\n } else {\n day = thisDay.getDate();\n thisDay.setDate(1);\n }\n \n // the calendar will be drawn as a table\n // you can customize the table elements with a global CSS style sheet,\n // or by hardcoding style and formatting elements below\n var crlf = "\sr\sn";\n var TABLE = "<table cols=7 class='dpTable'>" + crlf;\n var xTABLE = "</table>" + crlf;\n var TR = "<tr class='dpTR'>";\n var TR_title = "<tr class='dpTitleTR'>";\n var TR_days = "<tr class='dpDayTR'>";\n var TR_todaybutton = "<tr class='dpTodayButtonTR'>";\n var xTR = "</tr>" + crlf;\n var TD = "<td class='dpTD' onMouseOut='this.className=\s"dpTD\s";' onMouseOver=' this.className=\s"dpTDHover\s";' "; // leave this tag open, because we'll be adding an onClick event\n var TD_noday = "<td class='dpTDnoDay'>"; /// mptw add\n var TD_title = "<td colspan=5 class='dpTitleTD'>";\n var TD_buttons = "<td class='dpButtonTD'>";\n var TD_todaybutton = "<td colspan=7 class='dpTodayButtonTD'>";\n var TD_days = "<td class='dpDayTD'>";\n var TD_selected = "<td class='dpDayHighlightTD' onMouseOut='this.className=\s"dpDayHighlightTD\s";' onMouseOver='this.className=\s"dpTDHover\s";' "; // leave this tag open, because we'll be adding an onClick event\n var xTD = "</td>" + crlf;\n var DIV_title = "<div class='dpTitleText'>";\n var DIV_selected = "<div class='dpDayHighlight'>";\n var xDIV = "</div>";\n \n // start generating the code for the calendar table\n var html = TABLE;\n \n // this is the title bar, which displays the month and the buttons to\n // go back to a previous month or forward to the next month\n html += TR_title;\n html += TD_buttons + getButtonCode(dateFieldName, thisDay, -1, "<") + xTD;\n html += TD_title + DIV_title + monthArrayLong[ thisDay.getMonth()] + " " + thisDay.getFullYear() + xDIV + xTD;\n html += TD_buttons + getButtonCode(dateFieldName, thisDay, 1, ">") + xTD;\n html += xTR;\n \n // this is the row that indicates which day of the week we're on\n html += TR_days;\n for(i = 0; i < dayArrayShort.length; i++)\n html += TD_days + dayArrayShort[i] + xTD;\n html += xTR;\n \n // now we'll start populating the table with days of the month\n html += TR;\n \n // first, the leading blanks\n for (i = 0; i < thisDay.getDay(); i++)\n html += TD_noday + " " + xTD;\n \n // now, the days of the month\n do {\n dayNum = thisDay.getDate();\n TD_onclick = " onclick=\s"updateDateField('" + dateFieldName + "', '" + getDateString(thisDay) + "');\s">";\n \n if (dayNum == day)\n html += TD_selected + TD_onclick + DIV_selected + dayNum + xDIV + xTD;\n else\n html += TD + TD_onclick + dayNum + xTD;\n \n // if this is a Saturday, start a new row\n if (thisDay.getDay() == 6)\n html += xTR + TR;\n \n // increment the day\n thisDay.setDate(thisDay.getDate() + 1);\n } while (thisDay.getDate() > 1)\n \n // fill in any trailing blanks\n if (thisDay.getDay() > 0) {\n for (i = 6; i > thisDay.getDay(); i--)\n html += TD_noday + " " + xTD;\n }\n html += xTR;\n \n // add a button to allow the user to easily return to today, or close the calendar\n var today = new Date();\n var todayString = "Today is " + dayArrayMed[today.getDay()] + ", " + monthArrayMed[ today.getMonth()] + " " + today.getDate();\n html += TR_todaybutton + TD_todaybutton;\n html += "<button class='dpTodayButton' onClick='refreshDatePicker(\s"" + dateFieldName + "\s");'>this month</button> ";\n html += "<button class='dpTodayButton' onClick='updateDateField(\s"" + dateFieldName + "\s");'>close</button>";\n html += xTD + xTR;\n \n // and finally, close the table\n html += xTABLE;\n \n document.getElementById(datePickerDivID).innerHTML = html;\n // add an "iFrame shim" to allow the datepicker to display above selection lists\n adjustiFrame();\n}\n\n\n/**\nConvenience function for writing the code for the buttons that bring us back or forward\na month.\n*/\nfunction getButtonCode(dateFieldName, dateVal, adjust, label)\n{\n var newMonth = (dateVal.getMonth () + adjust) % 12;\n var newYear = dateVal.getFullYear() + parseInt((dateVal.getMonth() + adjust) / 12);\n if (newMonth < 0) {\n newMonth += 12;\n newYear += -1;\n }\n \n return "<button class='dpButton' onClick='refreshDatePicker(\s"" + dateFieldName + "\s", " + newYear + ", " + newMonth + ");'>" + label + "</button>";\n}\n\n\n/**\nConvert a JavaScript Date object to a string, based on the dateFormat and dateSeparator\nvariables at the beginning of this script library.\n*/\nfunction getDateString(dateVal)\n{\n var dayString = "00" + dateVal.getDate();\n var monthString = "00" + (dateVal.getMonth()+1);\n dayString = dayString.substring(dayString.length - 2);\n monthString = monthString.substring(monthString.length - 2);\n \n switch (dateFormat) {\n case "dmy" :\n return dayString + dateSeparator + monthString + dateSeparator + dateVal.getFullYear();\n case "ymd" :\n return dateVal.getFullYear() + dateSeparator + monthString + dateSeparator + dayString;\n case "mdy" :\n default :\n return monthString + dateSeparator + dayString + dateSeparator + dateVal.getFullYear();\n }\n}\n\n\n/**\nConvert a string to a JavaScript Date object.\n*/\nfunction getFieldDate(dateString)\n{\n var dateVal;\n var dArray;\n var d, m, y;\n \n try {\n dArray = splitDateString(dateString);\n if (dArray) {\n switch (dateFormat) {\n case "dmy" :\n d = parseInt(dArray[0], 10);\n m = parseInt(dArray[1], 10) - 1;\n y = parseInt(dArray[2], 10);\n break;\n case "ymd" :\n d = parseInt(dArray[2], 10);\n m = parseInt(dArray[1], 10) - 1;\n y = parseInt(dArray[0], 10);\n break;\n case "mdy" :\n default :\n d = parseInt(dArray[1], 10);\n m = parseInt(dArray[0], 10) - 1;\n y = parseInt(dArray[2], 10);\n break;\n }\n dateVal = new Date(y, m, d);\n } else if (dateString) {\n dateVal = new Date(dateString);\n } else {\n dateVal = new Date();\n }\n } catch(e) {\n dateVal = new Date();\n }\n \n return dateVal;\n}\n\n\n/**\nTry to split a date string into an array of elements, using common date separators.\nIf the date is split, an array is returned; otherwise, we just return false.\n*/\nfunction splitDateString(dateString)\n{\n var dArray;\n if (dateString.indexOf("/") >= 0)\n dArray = dateString.split("/");\n else if (dateString.indexOf(".") >= 0)\n dArray = dateString.split(".");\n else if (dateString.indexOf("-") >= 0)\n dArray = dateString.split("-");\n else if (dateString.indexOf("\s\s") >= 0)\n dArray = dateString.split("\s\s");\n else\n dArray = false;\n \n return dArray;\n}\n\n/**\nUpdate the field with the given dateFieldName with the dateString that has been passed,\nand hide the datepicker. If no dateString is passed, just close the datepicker without\nchanging the field value.\n\nAlso, if the page developer has defined a function called datePickerClosed anywhere on\nthe page or in an imported library, we will attempt to run that function with the updated\nfield as a parameter. This can be used for such things as date validation, setting default\nvalues for related fields, etc. For example, you might have a function like this to validate\na start date field:\n\nfunction datePickerClosed(dateField)\n{\n var dateObj = getFieldDate(dateField.value);\n var today = new Date();\n today = new Date(today.getFullYear(), today.getMonth(), today.getDate());\n \n if (dateField.name == "StartDate") {\n if (dateObj < today) {\n // if the date is before today, alert the user and display the datepicker again\n alert("Please enter a date that is today or later");\n dateField.value = "";\n document.getElementById(datePickerDivID).style.visibility = "visible";\n adjustiFrame();\n } else {\n // if the date is okay, set the EndDate field to 7 days after the StartDate\n dateObj.setTime(dateObj.getTime() + (7 * 24 * 60 * 60 * 1000));\n var endDateField = document.getElementsByName ("EndDate").item(0);\n endDateField.value = getDateString(dateObj);\n }\n }\n}\n\n*/\nfunction updateDateField(dateFieldName, dateString)\n{\n // var targetDateField = document.getElementsByName(dateFieldName).item(0); MPTW edit\n var targetDateField = document.getElementById(dateFieldName);\n if (dateString)\n targetDateField.value = dateString;\n \n var pickerDiv = document.getElementById(datePickerDivID);\n pickerDiv.style.visibility = "hidden";\n pickerDiv.style.display = "none";\n \n adjustiFrame();\n targetDateField.focus();\n \n // after the datepicker has closed, optionally run a user-defined function called\n // datePickerClosed, passing the field that was just updated as a parameter\n // (note that this will only run if the user actually selected a date from the datepicker)\n if ((dateString) && (typeof(datePickerClosed) == "function"))\n datePickerClosed(targetDateField);\n}\n\n\n/**\nUse an "iFrame shim" to deal with problems where the datepicker shows up behind\nselection list elements, if they're below the datepicker. The problem and solution are\ndescribed at:\n\nhttp://dotnetjunkies.com/WebLog/jking/archive/2003/07/21/488.aspx\nhttp://dotnetjunkies.com/WebLog/jking/archive/2003/10/30/2975.aspx\n*/\nfunction adjustiFrame(pickerDiv, iFrameDiv)\n{\n // we know that Opera doesn't like something about this, so if we\n // think we're using Opera, don't even try\n var is_opera = (navigator.userAgent.toLowerCase().indexOf("opera") != -1);\n if (is_opera)\n return;\n \n // put a try/catch block around the whole thing, just in case\n try {\n if (!document.getElementById(iFrameDivID)) {\n // don't use innerHTML to update the body, because it can cause global variables\n // that are currently pointing to objects on the page to have bad references\n //document.body.innerHTML += "<iframe id='" + iFrameDivID + "' src='javascript:false;' scrolling='no' frameborder='0'>";\n var newNode = document.createElement("iFrame");\n newNode.setAttribute("id", iFrameDivID);\n newNode.setAttribute("src", "javascript:false;");\n newNode.setAttribute("scrolling", "no");\n newNode.setAttribute ("frameborder", "0");\n document.body.appendChild(newNode);\n }\n \n if (!pickerDiv)\n pickerDiv = document.getElementById(datePickerDivID);\n if (!iFrameDiv)\n iFrameDiv = document.getElementById(iFrameDivID);\n \n try {\n iFrameDiv.style.position = "absolute";\n iFrameDiv.style.width = pickerDiv.offsetWidth;\n iFrameDiv.style.height = pickerDiv.offsetHeight ;\n iFrameDiv.style.top = pickerDiv.style.top;\n iFrameDiv.style.left = pickerDiv.style.left;\n iFrameDiv.style.zIndex = pickerDiv.style.zIndex - 1;\n iFrameDiv.style.visibility = pickerDiv.style.visibility ;\n iFrameDiv.style.display = pickerDiv.style.display;\n } catch(e) {\n }\n \n } catch (ee) {\n }\n \n}\n\n\n/////////////////////////////////\n//// made a css tiddler\n////\nconfig.shadowTiddlers.DatePickerStyles = ''+\n'/* the div that holds the date picker calendar */\sn'+\n'.dpDiv {\sn'+\n'}\sn'+\n'\sn'+\n'\sn'+\n'/* the table (within the div) that holds the date picker calendar */\sn'+\n'.dpTable {\sn'+\n' font-family: Arial, Helvetica, sans-serif;\sn'+\n' text-align: center;\sn'+\n' color: [[ColorPalette::Foreground]];\sn'+\n' background-color: [[ColorPalette::PrimaryPale]];\sn'+\n' border: 1px solid [[ColorPalette::PrimaryLight]];\sn'+\n' }\sn'+\n'\sn'+\n'\sn'+\n'/* a table row that holds date numbers (either blank or 1-31) */\sn'+\n'.dpTR {\sn'+\n' }\sn'+\n'\sn'+\n'\sn'+\n'/* the top table row that holds the month, year, and forward/backward buttons */\sn'+\n'.dpTitleTR {\sn'+\n' }\sn'+\n'\sn'+\n'\sn'+\n'/* the second table row, that holds the names of days of the week (Mo, Tu, We, etc.) */\sn'+\n'.dpDayTR {\sn'+\n' }\sn'+\n'\sn'+\n'\sn'+\n'/* the bottom table row, that has the "This Month" and "Close" buttons */\sn'+\n'.dpTodayButtonTR {\sn'+\n' }\sn'+\n'\sn'+\n'\sn'+\n'/* a table cell that holds a date number (either blank or 1-31) */\sn'+\n'.dpTD {\sn'+\n' border: 1px solid [[ColorPalette::PrimaryLight]];\sn'+\n' background-color: [[ColorPalette::Background]];\sn'+\n' }\sn'+\n'\sn'+\n'\sn'+\n'/* a table cell that holds a highlighted day (usually either today\s's date or the current date field value) */\sn'+\n'.dpDayHighlightTD {\sn'+\n' background-color: [[ColorPalette::PrimaryMid]];\sn'+\n' border: 1px solid [[ColorPalette::Background]];\sn'+\n' color: [[ColorPalette::Background]];\sn'+\n' }\sn'+\n'\sn'+\n'\sn'+\n'/* the date number table cell that the mouse pointer is currently over (you can use contrasting colors to make it apparent which cell is being hovered over) */\sn'+\n'.dpTDHover {\sn'+\n' border: 1px solid [[ColorPalette::SecondaryDark]];\sn'+\n' cursor: pointer;\sn'+\n 'background: [[ColorPalette::SecondaryLight]];\sn'+\n 'color: [[ColorPalette::Foreground]];\sn'+\n' }\sn'+\n'\sn'+\n'\sn'+\n'/* the table cell that holds the name of the month and the year */\sn'+\n'.dpTitleTD {\sn'+\n' }\sn'+\n'\sn'+\n'\sn'+\n'/* a table cell that holds one of the forward/backward buttons */\sn'+\n'.dpButtonTD {\sn'+\n' }\sn'+\n'\sn'+\n'\sn'+\n'/* the table cell that holds the "This Month" or "Close" button at the bottom */\sn'+\n'.dpTodayButtonTD {\sn'+\n' }\sn'+\n'\sn'+\n'\sn'+\n'/* a table cell that holds the names of days of the week (Mo, Tu, We, etc.) */\sn'+\n'.dpDayTD {\sn'+\n' background-color: [[ColorPalette::PrimaryPale]];\sn'+\n' border: 1px solid [[ColorPalette::PrimaryPale]];\sn'+\n' color: [[ColorPalette::PrimaryDark]];\sn'+\n' }\sn'+\n'\sn'+\n'\sn'+\n'/* additional style information for the text that indicates the month and year */\sn'+\n'.dpTitleText {\sn'+\n' font-size: 90%;\sn'+\n' color: [[ColorPalette::PrimaryDark]];\sn'+\n' font-weight: bold;\sn'+\n' }\sn'+\n'\sn'+\n'\sn'+\n'/* additional style information for the cell that holds a highlighted day (usually either today\s's date or the current date field value) */ \sn'+\n'.dpDayHighlight {\sn'+\n' font-weight: bold;\sn'+\n' }\sn'+\n'\sn'+\n'\sn'+\n'/* the forward/backward buttons at the top */\sn'+\n'.dpButton {\sn'+\n' }\sn'+\n'.dpButton:hover,.dpTodayButton:hover {\sn'+\n' background-color: [[ColorPalette::SecondaryLight]];\sn'+\n' border: 1px solid [[ColorPalette::SecondaryDark]];\sn'+\n' color: [[ColorPalette::Foreground]];\sn'+\n'}\sn'+\n'\sn'+\n'\sn'+\n'/* the "This Month" and "Close" buttons at the bottom */\sn'+\n'.dpTodayButton, .dpButton {\sn'+\n' font-family: Arial, Helvetica, sans-serif;\sn'+\n' font-size: 10px;\sn'+\n' color: [[ColorPalette::Foreground]];\sn'+\n' background: [[ColorPalette::PrimaryPale]];\sn'+\n' font-weight: bold;\sn'+\n' border: 1px solid [[ColorPalette::PrimaryPale]];\sn'+\n' }\sn'+\n'.dpTDnoDay {\sn'+\n' background: [[ColorPalette::PrimaryPale]];\sn'+\n' border-style:none;\sn'+\n'}\sn'+\n'\sn'+\n'\sn'+\n'';\n\n///////////////////////////////////\n///////////////////////////////////\n// TW specific stuff here.\n//\n\n// use the hook thoughtfully provided by Julian\nfunction datePickerClosed(dateField) {\n var dateObj = getFieldDate(dateField.value);\n var hiddenField = document.getElementById("hiddenDate"+dateField.id);\n hiddenField.value = dateObj.convertToYYYYMMDDHHMM();\n}\n\nconfig.macros.viewDate = {\n handler: function(place,macroName,params,wikifier,paramString,tiddler) {\n var fieldName = params[0];\n var val = store.getValue(tiddler,fieldName);\n createTiddlyElement(place,"span",null,"dateField",val?getDateString(Date.convertFromYYYYMMDDHHMM(val)):"-");\n }\n}\nconfig.macros.editDate = {\n dateFormat: "dmy", // this is the date picker's format\n dateSeparator: "/",\n handler: function(place,macroName,params,wikifier,paramString,tiddler) {\n var fieldName = params[0];\n story.setDirty(tiddler.title,true);\n\n // this will contain the human readable date\n // the date picker will work with this\n var visibleField = createTiddlyElement(place,"input",tiddler.title + fieldName);\n visibleField.readOnly = true;\n visibleField.size = 11;\n \n // this will be hidden and contains the date in\n // YYYYMMDDHHMM format it will be saved in store\n var hiddenField = createTiddlyElement(place,"input","hiddenDate"+visibleField.id);\n hiddenField.style.display = "none";\n // so TW knows it's a tiddler field when we save\n hiddenField.setAttribute("edit",fieldName);\n //hiddenField.setAttribute("type","value");\n\n var val = store.getValue(tiddler,fieldName);\n visibleField.value = val?val:"";\n visibleField.value = val?getDateString(Date.convertFromYYYYMMDDHHMM(val)):"";\n\n // make the date picker work\n if(!tiddler.isReadOnly()) {\n visibleField.onclick = function() {\n displayDatePicker(this.id,this,config.macros.editDate.dateFormat,config.macros.editDate.dataSeparator);\n return false;\n };\n createTiddlyButton(place,"#","Click to select date",\n function() {displayDatePicker(visibleField.id, visibleField, 'dmy','/');return false;},\n 'dateSelect');\n }\n \n }\n};\n\nconfig.shadowTiddlers.DateSelectStyles = \n".dateSelect {font-size:120%;margin:0.2em;border:1px solid [[ColorPalette::PrimaryMid]];border-top-width:0.2em;padding:0 0.2em;";\n\nif (store) {\n store.addNotification("DateSelectStyles",refreshStyles);\n store.addNotification("DatePickerStyles",refreshStyles);\n}\nelse {\n config.notifyTiddlers.push({name:"DateSelectStyles", notify: refreshStyles});\n config.notifyTiddlers.push({name:"DatePickerStyles", notify: refreshStyles});\n}\n\n//}}}\n
Welcome Demos Plugins
newest at the top
Do this thing asap...
Download the [[full monty|index.html]]
<div class='toolbar' macro='toolbar +saveTiddler -cancelTiddler deleteTiddler closeOthers'></div>\n<div class='title' macro='view title'></div>\n<div macro='showWhen tiddler.isTagged("Event")'>[[EventEdit]]</div>\n<div class='editor' macro='edit title'></div>\n<div class='editor' macro='edit tags'></div><div class='editorFooter'><span macro='message views.editor.tagPrompt'></span><span macro='tagChooser'></span></div>\n<div macro='showWhen tiddler.isTagged("hasDate")'>Date:<span macro="editDate startdate"></span></div>\n<div class='editor' macro='edit text'></div>\n
merge(config.macros,{\n eval: {\n handler: function(place,macroName,params,wikifier,paramString,tiddler) {\n wikify(""+eval(paramString),place,null,tiddler);\n }\n }\n});
{{{<<showEvents>>}}}\n<<showEvents>>
<table><tr>\n<tr><td align="right"><b>Date:</b></td><td>\n\n<span\n macro="select event.start.day '1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31' "></span>-<span\n macro="select event.start.month {{config.messages.dates.shortMonths.join(' ')}} "></span>-<span\n macro="select event.start.year '2006 2007 2008' "></span>\n</td></tr>\n\n<tr><td align="right"><b>Time:</b></td><td>\n\n<span\n macro="select event.start.hour '1 2 3 4 5 6 7 8 9 10 11 12' "></span>:<span\n macro="select event.start.minute '00 15 30 45' "></span>:<span\n macro="select event.start.ampm 'am pm' "></span>\n\n</td></tr>\n\n<tr><td align="right"><b>Duration:</b></td><td>\n<span macro="select event.duration.hour '0 1 2 3 4 6 8 10 12 18 24' "></span>:<span macro="select event.duration.minute '00 15 30 45' "></span>\n</td></tr>\n\n<td align="right"><b>Location:</b></td><td macro="edit event.location"></td></tr>\n\n<tr><td align="right"><b>Reminder:</b></td><td>\n<span macro="select event.reminder '[[1 min]] [[5 min]] [[10 min]] [[30 min]] [[1 hour]] [[1 day]] [[2 days]] [[1 week]]' "></span> before\n</td></tr>\n\n</table>\n<br/>\n
<table class="eventDetails"><tr>\n<tr><td align="right"><b>Date:</b></td>\n<td>\n <span macro="view event.start.day"></span>-<span macro="view event.start.month"></span>-<span macro="view event.start.year"></span>\n</td></tr>\n<tr><td align="right"><b>Time:</b></td><td>\n <span macro="view event.start.hour"></span>:<span macro="view event.start.minute"></span> <span macro="view event.start.ampm"></span>\n</td></tr>\n<tr><td align="right"><b>Duration:</b></td>\n<td>\n <span macro="view event.duration.hour"></span>:<span macro="view event.duration.minute"></span>\n</td>\n<tr><td align="right"><b>Location:</b></td>\n<td>\n <span macro="view event.location"></span>\n</td>\n<tr><td align="right"><b>Reminder:</b></td>\n<td>\n <span macro="view event.reminder"></span> before\n</td>\n\n</tr>\n\n</table>\n\n
Have a look at [[Meeting with Bob]]. Edit it. The event data is store in the tiddler fields which are a new feature of 2.1. \n\nThe view and edit controls for the event data are added to ViewTemplate and EditTemplate using HideWhenMacro. See EventEdit and EventView.\n\nThe SelectMacro (inspired by Clint Checketts' SelectMacro) does the dropdown selectors for the hours, days etc.\n\n--There are one or two minor core tweaks required to make it all work--. No tweaks in beta 7..\n\nYou can make a <<newTiddler tag:Event label:'new event' title:'New Event' text:'Event details'>> but at the moment you have to save before it looks like an event. Need a way to get around that..\n\nI plan to make a reminders system using events like this (but I'm hoping Jeremy S will beat me to it).\n\n!Updates\n!!21-Sep-2006\n* Started on reminders system. See [[Event]] and ShowEventsMacro.\n\n!!29-Sep-2006\n* Will probably use a date picker. See demo here:\nhttp://simonbaird.com/test/datetest2.html\n\n\n!Todo\n* specify an all day event\n* showEvents doesn't filter on time, eg show me upcoming events this month (instead of every event ever).\n* maybe store start time as timestamp same format at created and modified\n* prettier layout for event display, eg week view, month view etc.\n* have a process that checks every 60 seconds for reminders and pops up an actual real time reminder\n
/***\n|''Name:''|ExamplePlugin|\n|''Description:''|To demonstrate how to write TiddlyWiki plugins|\n|''Version:''|2.0.2|\n|''Date:''|Jul 12, 2006|\n|''Source:''|http://www.tiddlywiki.com/#ExamplePlugin|\n|''Author:''|JeremyRuston (jeremy (at) osmosoft (dot) com)|\n|''License:''|[[BSD open source license]]|\n|''~CoreVersion:''|2.1.0|\n|''Browser:''|Firefox 1.0.4+; Firefox 1.5; InternetExplorer 6.0|\n***/\n\n//{{{\n// Don't do anything very much, this is just an example\n//}}}\n\n// deliberateError();\n// Log a message\npluginInfo.log.push("This is a test message from " + tiddler.title);\n
/***\n|''Name:''|ExampleThreePlugin|\n|''Description:''|To demonstrate how to write TiddlyWiki plugins|\n|''Version:''|2.0.2|\n|''Date:''|Jul 12, 2006|\n|''Source:''|http://www.tiddlywiki.com/#ExamplePlugin|\n|''Author:''|JeremyRuston (jeremy (at) osmosoft (dot) com)|\n|''License:''|[[BSD open source license]]|\n|''~CoreVersion:''|2.0.0|\n|''Browser:''|Firefox 1.0.4+; Firefox 1.5; InternetExplorer 6.0|\n***/\n\n//{{{\n// Don't do anything, this is just an example\n//}}}\n\ndeliberateError();
/***\n|''Name:''|ExampleTwoPlugin|\n|''Description:''|To demonstrate how to write TiddlyWiki plugins|\n|''Version:''|2.0.3|\n|''Date:''|Jul 17, 2006|\n|''Source:''|http://www.tiddlywiki.com/#ExamplePlugin|\n|''Author:''|JeremyRuston (jeremy (at) osmosoft (dot) com)|\n|''License:''|[[BSD open source license]]|\n|''~CoreVersion:''|2.2.0|\n|''Browser:''|Firefox 1.0.4+; Firefox 1.5; InternetExplorer 6.0|\n***/\n\n//{{{\n// Don't do anything, this is just an example\n//}}}\n\n
/***\n!Example\n<<fieldLink created '0DD-0MM-YYYY hh12:0mm am'>>\n<<fieldLink modified '0DD-0MM-YYYY hh12:0mm am'>>\n<<fieldLink modifier>>\n\n!Code\n***/\n//{{{\n\nmerge(config.macros,{\n fieldLink: {\n handler: function (place,macroName,params,wikifier,paramString,tiddler) {\n createTiddlyLink(place,\n params[1] ?\n tiddler[params[0]].formatString(params[1]) :\n tiddler[params[0]],\n true);\n }\n }\n});\n\n//}}}\n
Type the text for 'New Tiddler'
Type the text for 'New Tiddler'
Type the text for 'New Tiddler'
Welcome to the beta 1 release of revision 2.1 of TiddlyWiki. Feedback and discussion is welcome in the [[TiddlyWikiDev Google group|http://groups.google.com/group/TiddlyWikiDev]].\n\n@@Note - this is unstable, potentially broken ''beta'' code: it's not quite finished and it's not been tested with the various [[Plugins]] on which TiddlyWiki users rely. Don't use it for anything important unless you know what you're doing.@@\n\nThis substantial new release of TiddlyWiki adds several features:\n* A PluginManager to make it easier to use TiddlyWiki [[Plugins]]\n* New PluginFormat conventions\n* An ImportTiddlers wizard macro to easily get [[Plugins]] and other content from other TiddlyWiki files\n* A new ColorPalette that makes it easier to change the overall colour scheme of TiddlyWiki (see the AlternativeColorPalette for an example)\n* TiddlerFields for [[Plugins]] to store custom metadata attached to a tiddler\n* TiddlerSlicing for extracting chunks from a tiddler\n* The beginnings of a security infrastructure with TiddlerFingerprints\n* A new ListView gadget for displaying tabular data\n* Basic support for XMLHttpRequest operations\n* Partial compliance with XHTML (full compliance will be possible via [[Plugins]])\n* The ability to use tags to SwitchFormatters for a particular tiddler\n* Improvements to the DateFormatString, including ISO-8601 week numbers\n* The ability to use the tab key to type tab characters instead of to skip fields (see AdvancedOptions)\n* Improved performance for many common operations\n* Extensive bug fixes and refactorings\nSee the full [[release note at tiddlywiki.org|http://trac.tiddlywiki.org/tiddlywiki/wiki/ReleaseNoteTwoPointOne]]
/***\n| Name:|HideWhenPlugin|\n| Description:|Allows conditional inclusion/exclusion in templates|\n| Version:|1.0.2|\n| Date:|19-Sep-2006|\n| Source:|http://mptw.tiddlyspot.com/#HideWhenMacro|\n| Author:|Simon Baird <simon.baird@gmail.com>|\nFor use in ViewTemplate and EditTemplate. Eg\n{{{<div macro="showWhen tiddler.tags.contains('Task')">[[TaskToolbar]]</div>}}}\n{{{<div macro="showWhen tiddler.modifier == 'BartSimpson'"><img src="bart.gif"/></div>}}}\n***/\n//{{{\nmerge(config.macros,{\n hideWhen: { handler: function (place,macroName,params,wikifier,paramString,tiddler) {\n if (eval(paramString)) {\n removeChildren(place);\n place.parentNode.removeChild(place);\n }\n }},\n showWhen: { handler: function (place,macroName,params,wikifier,paramString,tiddler) {\n config.macros.hideWhen.handler(place,macroName,params,wikifier,'!('+paramString+')',tiddler);\n }}\n});\n//}}}\n
The new {{{<<importTiddlers>>}}} macro provides a step-by-step user interface for importing tiddlers from other TiddlyWiki files. It can only be used properly when TiddlyWiki is stored locally on a {{{file:///}}} URL.\n\n{{{<<importTiddlers>>}}} can read documents that are stored on the web or on locally accessible disks. It is implemented using XMLHttpRequest.\n\nThere are a few enhancements that are due to be introduced in subsequent releases:\n* The ability to sort and filter the list of tiddlers\n* The ability to preview an incoming tiddler in its fully wikified form\n* Macro parameters to permit automation\n\n<<importTiddlers>>
"Knock knock"\n"Who's there?"\n"$1"\n"$1 who?"\n"$2"\n
/***\n|''Name:''|LegacyStrikeThroughPlugin|\n|''Description:''|Support for legacy (pre 2.1) strike through formatting|\n|''Version:''|1.0.1|\n|''Date:''|Jul 21, 2006|\n|''Source:''|http://www.tiddlywiki.com/#LegacyStrikeThroughPlugin|\n|''Author:''|MartinBudden (mjbudden (at) gmail (dot) com)|\n|''License:''|[[BSD open source license]]|\n|''CoreVersion:''|2.1.0|\n|''Browser:''|Firefox 1.0.4+; Firefox 1.5; InternetExplorer 6.0|\n\n***/\n\n//{{{\n\n// Ensure that the LegacyStrikeThrough Plugin is only installed once.\nif(!version.extensions.LegacyStrikeThroughPlugin)\n {\n version.extensions.LegacyStrikeThroughPlugin = true;\n\nconfig.formatters.push(\n{\n name: "legacyStrikeByChar",\n match: "==",\n termRegExp: /(==)/mg,\n element: "strike",\n handler: config.formatterHelpers.createElementAndWikify\n});\n\n} // end of "install only once"\n//}}}\n
|''URL:''|http://lewcid.googlepages.com/lewcid.html|
Stuff to see:\n!Events\nTiddler meta data in 2.1 is awesome. This example shows how to use tiddler meta data and some small hacks to create an editable event. TiddlyWiki needs an updated version of Jeremy Sheeley's ReminderMacros plugin that works like this. The SelectMacro was mostly written by Clint Checketts, who deserves a lot of credit for this demo. To create a new event, create a new tiddler and tag it with [[Event]]. See\n* [[Meeting with Bob]]\n* SelectMacro\n* EventEdit\n* EventView\n* ViewTemplate\n* EditTemplate\n\n!SelectPaletteMacro\nI'm a big fan of palettes in 2.1. Now I can switch between palettes easily. Try it here:\n<<selectPalette>>\n\n!ToggleTagMacro\nNot much to see but it's leaner and freshened up for 2.1. It now uses createTiddlyCheckbox. Try it here:\n<<toggleTag Done>>\nSee also\n* ViewTemplate\n\n!HideWhenMacro\nThis is my favourite one liner. Used in both of the above examples.\n
[[Welcome]]\n[[Plugins]]\n[[Demos]]\n[[ImportTiddlers]]\n[[PluginManager]]\nhttp://www.tiddlywiki.com/beta/
<script type="text/javascript" src="DatePicker2.js"></script>
(Remember to bring the blah file)\n!Agenda\n* Figure out the foobar\n* Finalise bazqux details\n
http://monkeygtd.tiddlyspot.com/
/***\nName: MonkeyPirateStyles\nSource: http://mptw.tiddlyspot.com/\nPut [/%%/[~MonkeyPirateStyles]/%%/] at the top of your StyleSheet tiddler.\n***/\n/*{{{*/\n/* a contrasting background so I can see where one tiddler ends and the other begins */\nbody {\n background: [[ColorPalette::TertiaryLight]];\n}\n\n/* sexy colours and font for the header */\n.headerForeground {\n color: [[ColorPalette::PrimaryLight]];\n}\n.headerShadow {\n color: [[ColorPalette::PrimaryMid]];\n}\n.headerForeground, .headerShadow {\n padding: 1em 1em 0;\n font-family: 'Trebuchet MS' sans-serif;\n font-weight:bold;\n}\n\n/* make shadow go and down right instead of up and left */\n.headerShadow {\n left: 1px;\n top: 1px;\n}\n\n/* prefer monospace for editing */\n.editor textarea {\n font-family: 'Consolas' monospace;\n}\n\n/* sexy tiddler titles */\n.title {\n font-size: 250%;\n color: [[ColorPalette::PrimaryLight]];\n font-family: 'Trebuchet MS' sans-serif;\n}\n\n/* more subtle tiddler subtitle */\n.subtitle {\n padding:0px;\n margin:0px;\n padding-left:0.5em;\n font-size: 90%;\n color: [[ColorPalette::TertiaryMid]];\n}\n.subtitle .tiddlyLink {\n color: [[ColorPalette::TertiaryMid]];\n}\n\n/* a little bit of extra whitespace */\n.viewer {\n padding-bottom:3px;\n}\n\n/* don't want any background color for headings */\nh1,h2,h3,h4,h5,h6 {\n background: [[ColorPalette::Background]];\n color: [[ColorPalette::Foreground]];\n}\n\n/* give tiddlers 3d style border and explicit background */\n.tiddler {\n background: [[ColorPalette::Background]];\n border-right: 2px [[ColorPalette::TertiaryMid]] solid;\n border-bottom: 2px [[ColorPalette::TertiaryMid]] solid;\n margin-bottom: 1em;\n padding-bottom: 2em;\n}\n\n/* the borders look wrong with the body background */\n#sidebar .button {\n border-style: none;\n}\n\n/* horizontal main menu stuff */\n#displayArea {\n margin: 1em 15.7em 0em 1em; /* use the freed up space */\n}\n#topMenu br {\n display: none;\n}\n#topMenu {\n background: [[ColorPalette::PrimaryMid]];\n color:[[ColorPalette::PrimaryPale]];\n}\n#topMenu {\n padding:2px;\n}\n#topMenu .button, #topMenu .tiddlyLink, #topMenu a {\n margin-left: 0.5em;\n margin-right: 0.5em;\n padding-left: 3px;\n padding-right: 3px;\n color: [[ColorPalette::PrimaryPale]];\n font-size: 115%;\n}\n#topMenu .button:hover, #topMenu .tiddlyLink:hover {\n background: [[ColorPalette::PrimaryDark]];\n}\n@media print {\n #topMenu {\n display: none ! important;\n }\n}\n/*}}}*/\n
|''URL:''|http://tiddlyspot.com/mptw/|
Type the text for 'MonkeyPirateTiddlyWiki'
Background: #fff\nForeground: #000\nPrimaryPale: #69c\nPrimaryLight: #36a\nPrimaryMid: #025\nPrimaryDark: #012\nSecondaryPale: #ffc\nSecondaryLight: #fe8\nSecondaryMid: #db4\nSecondaryDark: #520\nTertiaryPale: #eee\nTertiaryLight: #ccc\nTertiaryMid: #999\nTertiaryDark: #666\nError: #f88
Event details
Upload Password:\n<<option pasUploadPassword>>\n\n<<selectPalette>>\n\nThese InterfaceOptions for customising TiddlyWiki are saved in your browser\n\nYour username for signing your edits. Write it as a WikiWord (eg JoeBloggs)\n\n<<option txtUserName>>\n<<option chkSaveBackups>> SaveBackups\n<<option chkAutoSave>> AutoSave\n<<option chkRegExpSearch>> RegExpSearch\n<<option chkCaseSensitiveSearch>> CaseSensitiveSearch\n<<option chkAnimate>> EnableAnimations\n\n----\nAdvancedOptions\nPluginManager\nImportTiddlers
Type the text for 'New Tiddler'
<<refreshDisplay>>\nBackground: #dd8;\nForeground: #f00\nPrimaryPale: #8cf\nPrimaryLight: #369\nPrimaryMid: #036\nPrimaryDark: #012\nSecondaryPale: #ffc\nSecondaryLight: #fe8\nSecondaryMid: #db4\nSecondaryDark: #841\nTertiaryPale: #eee\nTertiaryLight: #ccc\nTertiaryMid: #999\nTertiaryDark: #666\nError: #f88\n
/***\n{{{<<packageAsShadow EditTemplate ViewTemplate>>}}}\n<<packageAsShadow EditTemplate ViewTemplate>>\n***/\n//{{{\nmerge(config.macros,{\n\n packageAsShadow: {\n\n defaultTiddlers: [\n "StyleSheet",\n "MonkeyPirateStyles",\n "ViewTemplate",\n "EditTemplate",\n "PageTemplate"\n ],\n\n handler: function(place,macroName,params,wikifier,paramString,tiddler) {\n var list = params.length == 0 ? this.defaultTiddlers : params;\n var output = [];\n for (var i=0;i<list.length;i++)\n output.push(this.textToJs(list[i],store.getTiddlerText(list[i])));\n var textArea = createTiddlyElement(place,"textarea");\n textArea.rows = 8;\n textArea.cols = 80;\n textArea.readOnly = true;\n textArea.wrap = false;\n textArea.onclick = function() { this.select(); }\n textArea.value = ("//{{{\snmerge(config.shadowTiddlers,{\sn\sn" +\n output.join(",\sn\sn") +\n "\sn\sn});\sn//}}}\sn");\n },\n\n textToJs: function(name,text) {\n if (text)\n return '"'+name+'":\sn "' + \n text.replace(/"/g,'\s\s"').split("\sn").join('\s\sn"+\sn "') + '"';\n else\n return "";\n }\n }\n\n});\n//}}}\n
<div class='header' macro='gradient vert [[ColorPalette::PrimaryLight]] [[ColorPalette::PrimaryMid]]'>\n<div class='headerShadow'>\n<span class='siteTitle' refresh='content' tiddler='SiteTitle'></span> \n<span class='siteSubtitle' refresh='content' tiddler='SiteSubtitle'></span>\n</div>\n<div class='headerForeground'>\n<span class='siteTitle' refresh='content' tiddler='SiteTitle'></span> \n<span class='siteSubtitle' refresh='content' tiddler='SiteSubtitle'></span>\n</div>\n</div>\n<div id='topMenu' refresh='content' tiddler='MainMenu'></div>\n</div>\n<!--<div id='mainMenu' refresh='content' tiddler='MainMenu'></div>-->\n<div id='sidebar'>\n<div id='sidebarOptions' refresh='content' tiddler='SideBarOptions'></div>\n<div id='sidebarTabs' refresh='content' force='true' tiddler='SideBarTabs'></div>\n</div>\n<div id='displayArea'>\n<div id='messageArea'></div>\n<div id='tiddlerDisplay'></div>\n</div>
I'm using --ShowPaletteMacro-- ViewPalettePlugin in my ViewTemplate to display a palettes with a colour swatch. Look at some <<tag palette>>s to see how it looks. The colour swatches update automatically if you edit the colours. Try it and see.\n\nAs well as that there is an "apply" button in the toolbar which uses a macro from SelectPaletteMacro to apply that palette's colour scheme.\n\nSelectPaletteMacro also provides a drop-down selector for palettes. It looks like this:\n<<selectPalette>>
/***\n|''Name:''|Plugin: Syntaxify|\n|''Description:''|Performs syntax highlighting on CSS, JavaScript, and HTML/XML|\n|''Version:''|1.0.2|\n|''Date:''|Aug 11, 2006|\n|''Source:''|http://bob.mcelrath.org/syntaxify.html|\n|''Author:''|BobMcElrath|\n|''Email:''|my first name at my last name dot org|\n|''License:''|[[GPL open source license|http://www.gnu.org/licenses/gpl.html]]|\n|''~CoreVersion:''|2.0.0|\n!Description\nThis plugin will syntax highlight ("pretty-print") source code used by TiddlyWiki. To activate CSS markup, enclose the code in the CSS code in the delimiters \n<html><code>\n/*{{{*/<br/>\n/* CSS code here */<br/>\n/*}}}*/<br/>\n</code></html>\nTo activate XML markup, enclose your HTML/XML in the delimiters\n<html><code>\n<!--{{{--><br/>\n<!-- XML/HTML code here --><br/>\n<!--}}}--><br/>\n</code></html>\nAnd to activate JavaScript markup, enclose your code in the delimiters\n<html><code>\n//{{{<br/>\n// JavaScript code here.<br/>\n//}}}<br/>\n</code></html>\n!History\n* 1.0.2 Release\n** Don't use {{{class}}} as a variable name, dummy.\n* 1.0.1 Release\n** Simplified stylesheet and removed line numbering.\n** Fixed highlighting when <html><code>*/</code></html> appeared at the beginning of a line.\n** Fixed blank lines not being shown if {{{list-style-type: none}}} was turned on.\n** Small speedups\n* 1.0.0 Initial Release\n!Code\n***/\n//{{{\nversion.extensions.Syntaxify = { major: 1, minor: 0, revision: 0, date: new Date(2006,08,10),\n source: "http://bob.mcelrath.org/syntaxify.html"\n};\n\nvar syntaxify = {}\n\nsyntaxify.regexpSpace = new RegExp(" ", "mg");\nsyntaxify.regexpTab = new RegExp("\st", "mg");\nsyntaxify.regexpAmp = new RegExp("&","mg");\nsyntaxify.regexpLessThan = new RegExp("<","mg");\nsyntaxify.regexpGreaterThan = new RegExp(">","mg");\nsyntaxify.regexpQuote = new RegExp("\s"","mg");\nString.prototype.htmlFix = function() {\n return(this.replace(syntaxify.regexpAmp,"&")\n .replace(syntaxify.regexpLessThan,"<")\n .replace(syntaxify.regexpGreaterThan,">")\n .replace(syntaxify.regexpQuote,""")\n .replace(syntaxify.regexpSpace," ")\n .replace(syntaxify.regexpTab," "));\n}\n\nsyntaxify.handleSpanClass = function(w) {\n var match, lastPos=0;\n if(this.lookahead) {\n var lookaheadRegExp = new RegExp(this.lookahead,"mg"); \n lookaheadRegExp.lastIndex = w.matchStart; \n var lookaheadMatch = lookaheadRegExp.exec(w.source); \n if(lookaheadMatch && lookaheadMatch.index == w.matchStart) { \n createTiddlyText(w.output, lookaheadMatch[1]);\n var e = createTiddlyElement(w.output, "span", null, this.name);\n e.innerHTML = this.simple?lookaheadMatch[2]:lookaheadMatch[2].htmlFix();\n }\n } else {\n while((match = regexpNewLine.exec(w.matchText)) != null) { // multi-line\n var alt = "";\n var e = createTiddlyElement(w.output, "span", null, this.name);\n e.innerHTML = this.simple?w.matchText.substr(lastPos,match.index-lastPos)\n :w.matchText.substr(lastPos,match.index-lastPos).htmlFix();\n if(w.output.className != "alt") alt = "alt";\n w.output = createTiddlyElement(w.output.parentNode, "li", null, alt);\n lastPos = match.index;\n } \n var e = createTiddlyElement(w.output, "span", null, this.name);\n e.innerHTML = this.simple?w.matchText.substr(lastPos, w.matchText.length-lastPos)\n :w.matchText.substr(lastPos, w.matchText.length-lastPos).htmlFix();\n }\n}\n\n/* This is a shadow tiddler. Do not edit it here. Instead, open the tiddler StyleSheetSyntaxify \n * and edit it instead. (go to the toolbar on the right and select "More"->"Shadowed") */\nconfig.shadowTiddlers.StyleSheetSyntaxify = "/*{{{*/\sn"\n+".viewer div.syntaxify {\sn"\n+" font-family: 'Courier New' , Courier, mono;\sn"\n+" background-color: #ffc;\sn"\n+" border: 1px solid #fe8;\sn"\n+" padding: 0.5em;\sn"\n+" margin: 0 0 1em 0.5em;\sn"\n+" font-size: 1.2em;\sn"\n+" overflow: auto;\sn"\n+"}\sn\sn"\n+".syntaxify ol {\sn"\n+" margin: 0;\sn"\n+" padding: 1px;\sn"\n+" color: #2B91AF;\sn"\n+"}\sn\sn"\n+".syntaxify ol li {\sn"\n+" background-color: #ffc;\sn"\n+" color: black;\sn"\n+" list-style-type: none;\sn"\n+"/* An alternate style to enable line numbering -- remove the line above and uncomment below if desired */\sn"\n+"/*\sn"\n+" list-style-type: 1;\sn"\n+" border-left: 3px solid #fe8;\sn"\n+" margin-left: 3.5em;\sn"\n+"*/\sn"\n+"}\sn\sn"\n+".syntaxify ol li.alt { background-color: #ffe; }\sn\sn"\n+".syntaxify ol li span { color: black; }\sn"\n+".syntaxify .singleLineComment { color: green; }\sn"\n+".syntaxify .multiLineComment { color: green; }\sn"\n+".syntaxify .tag { font-weight: bold; color: blue; }\sn"\n+".syntaxify .tagname { font-weight: bold; color: black; }\sn"\n+".syntaxify .attribute { color: rgb(127,0,85); }\sn"\n+".syntaxify .value { color: rgb(42,0,255); }\sn"\n+".syntaxify .keyword { color: #006699; }\sn"\n+".syntaxify .doubleQuotedString { color: blue; }\sn"\n+".syntaxify .singleQuotedString { color: blue; }\sn"\n+".syntaxify .blockDelimiter { color: maroon; }\sn"\n+".syntaxify .groupDelimiter { color: olive; }\sn"\n+".syntaxify .number { color: maroon; }\sn"\n+".syntaxify .color { color: maroon; }\sn"\n+".syntaxify .font { color: navy; }\sn"\n+".syntaxify .important { color: red; }\sn"\n+".syntaxify .class { color: black; }\sn"\n+".syntaxify .id { color: black; } \sn"\n+"/*}}}*/";\n\nstore.addNotification("StyleSheetSyntaxify",refreshStyles);\nconfig.shadowTiddlers.ViewTemplate = "<!--{{{-->\sn"+config.shadowTiddlers.ViewTemplate+"\sn<!--}}}-->";\nconfig.shadowTiddlers.EditTemplate = "<!--{{{-->\sn"+config.shadowTiddlers.EditTemplate+"\sn<!--}}}-->";\nconfig.shadowTiddlers.PageTemplate = "<!--{{{-->\sn"+config.shadowTiddlers.PageTemplate+"\sn<!--}}}-->";\nconfig.shadowTiddlers.StyleSheetPrint = "/*{{{*/\sn"+config.shadowTiddlers.StyleSheetPrint+"\sn/*}}}*/";\nsyntaxify.jsKeywords = [\n 'abstract', 'boolean', 'break', 'byte', 'case', 'catch', 'char', 'class',\n 'const', 'continue', 'debugger', 'default', 'delete', 'do', 'double',\n 'else', 'enum', 'export', 'extends', 'false', 'final', 'finally', 'float',\n 'for', 'function', 'goto', 'if', 'implements', 'import', 'in',\n 'instanceof', 'int', 'interface', 'long', 'native', 'new', 'null',\n 'package', 'private', 'protected', 'public', 'return', 'short', 'static',\n 'super', 'switch', 'synchronized', 'this', 'throw', 'throws', 'transient',\n 'true', 'try', 'typeof', 'var', 'void', 'volatile', 'while', 'with'\n];\nsyntaxify.cssKeywords = [\n 'ascent', 'azimuth', 'background-attachment', 'background-color',\n 'background-image', 'background-position', 'background-repeat',\n 'background', 'baseline', 'bbox', 'border-collapse', 'border-color',\n 'border-spacing', 'border-style', 'border-top', 'border-right',\n 'border-bottom', 'border-left', 'border-top-color', 'border-right-color',\n 'border-bottom-color', 'border-left-color', 'border-top-style',\n 'border-right-style', 'border-bottom-style', 'border-left-style',\n 'border-top-width', 'border-right-width', 'border-bottom-width',\n 'border-left-width', 'border-width', 'border', 'bottom', 'cap-height',\n 'caption-side', 'centerline', 'clear', 'clip', 'color', 'content',\n 'counter-increment', 'counter-reset', 'cue-after', 'cue-before', 'cue',\n 'cursor', 'definition-src', 'descent', 'direction', 'display',\n 'elevation', 'empty-cells', 'float', 'font-size-adjust', 'font-family',\n 'font-size', 'font-stretch', 'font-style', 'font-variant', 'font-weight',\n 'font', 'height', 'left', 'letter-spacing', 'line-height',\n 'list-style-image', 'list-style-position', 'list-style-type', 'list-style',\n 'margin-top', 'margin-right', 'margin-bottom', 'margin-left', 'margin',\n 'marker-offset', 'marks', 'mathline', 'max-height', 'max-width',\n 'min-height', 'min-width', 'orphans', 'outline-color', 'outline-style',\n 'outline-width', 'outline', 'overflow', 'padding-top', 'padding-right',\n 'padding-bottom', 'padding-left', 'padding', 'page', 'page-break-after',\n 'page-break-before', 'page-break-inside', 'pause', 'pause-after',\n 'pause-before', 'pitch', 'pitch-range', 'play-during', 'position',\n 'quotes', 'richness', 'right', 'size', 'slope', 'src', 'speak-header',\n 'speak-numeral', 'speak-punctuation', 'speak', 'speech-rate', 'stemh',\n 'stemv', 'stress', 'table-layout', 'text-align', 'text-decoration',\n 'text-indent', 'text-shadow', 'text-transform', 'unicode-bidi',\n 'unicode-range', 'units-per-em', 'vertical-align', 'visibility',\n 'voice-family', 'volume', 'white-space', 'widows', 'width', 'widths',\n 'word-spacing', 'x-height', 'z-index'\n];\nsyntaxify.cssValues = [\n 'above', 'absolute', 'all', 'always', 'aqua', 'armenian', 'attr', 'aural',\n 'auto', 'avoid', 'baseline', 'behind', 'below', 'bidi-override', 'black',\n 'blink', 'block', 'blue', 'bold', 'bolder', 'both', 'bottom', 'braille',\n 'capitalize', 'caption', 'center', 'center-left', 'center-right', 'circle',\n 'close-quote', 'code', 'collapse', 'compact', 'condensed', 'continuous',\n 'counter', 'counters', 'crop', 'cross', 'crosshair', 'cursive', 'dashed',\n 'decimal', 'decimal-leading-zero', 'default', 'digits', 'disc', 'dotted',\n 'double', 'embed', 'embossed', 'e-resize', 'expanded', 'extra-condensed',\n 'extra-expanded', 'fantasy', 'far-left', 'far-right', 'fast', 'faster',\n 'fixed', 'format', 'fuchsia', 'gray', 'green', 'groove', 'handheld',\n 'hebrew', 'help', 'hidden', 'hide', 'high', 'higher', 'icon',\n 'inline-table', 'inline', 'inset', 'inside', 'invert', 'italic', 'justify',\n 'landscape', 'large', 'larger', 'left-side', 'left', 'leftwards', 'level',\n 'lighter', 'lime', 'line-through', 'list-item', 'local', 'loud',\n 'lower-alpha', 'lowercase', 'lower-greek', 'lower-latin', 'lower-roman',\n 'lower', 'low', 'ltr', 'marker', 'maroon', 'medium', 'message-box',\n 'middle', 'mix', 'move', 'narrower', 'navy', 'ne-resize', 'no-close-quote',\n 'none', 'no-open-quote', 'no-repeat', 'normal', 'nowrap', 'n-resize',\n 'nw-resize', 'oblique', 'olive', 'once', 'open-quote', 'outset', 'outside',\n 'overline', 'pointer', 'portrait', 'pre', 'print', 'projection', 'purple',\n 'red', 'relative', 'repeat', 'repeat-x', 'repeat-y', 'ridge', 'right',\n 'right-side', 'rightwards', 'rtl', 'run-in', 'screen', 'scroll',\n 'semi-condensed', 'semi-expanded', 'separate', 'se-resize', 'show',\n 'silent', 'silver', 'slower', 'slow', 'small', 'small-caps',\n 'small-caption', 'smaller', 'soft', 'solid', 'speech', 'spell-out',\n 'square', 's-resize', 'static', 'status-bar', 'sub', 'super', 'sw-resize',\n 'table-caption', 'table-cell', 'table-column', 'table-column-group',\n 'table-footer-group', 'table-header-group', 'table-row', 'table-row-group',\n 'teal', 'text-bottom', 'text-top', 'thick', 'thin', 'top', 'transparent',\n 'tty', 'tv', 'ultra-condensed', 'ultra-expanded', 'underline',\n 'upper-alpha', 'uppercase', 'upper-latin', 'upper-roman', 'url', 'visible',\n 'wait', 'white', 'wider', 'w-resize', 'x-fast', 'x-high', 'x-large',\n 'x-loud', 'x-low', 'x-slow', 'x-small', 'x-soft', 'xx-large', 'xx-small',\n 'yellow'\n];\nsyntaxify.cssFonts = [\n '[mM]ono(?:space)?', '[tT]ahoma', '[vV]erdana', '[aA]rial', '[hH]elvetica',\n '[sS]ans(?:-serif)?', '[sS]erif', '[Cc]ourier'\n];\nsyntaxify.commonFormatters = [\n{ name: "spaces",\n match: "[ \s\st]+",\n handler: function(w) {\n var e = createTiddlyElement(w.output, "span", null, null);\n e.innerHTML = w.matchText.htmlFix();\n }\n},{ name: "newline",\n match: "\s\sn",\n handler: function(w) {\n var alt = ""\n if(w.output.className != "alt") alt = "alt";\n if(!w.output.hasChildNodes()) w.output.innerHTML = " ";\n w.output = createTiddlyElement(w.output.parentNode, "li", null, alt);\n }\n}];\nsyntaxify.commonClikeFormatters = [\n{ name: "multiLineComment",\n match: '/\s\s*(?:(?:.|(?:\s\sr)?\s\sn)(?!\s\s*/))*(?:.|(?:\s\sr)?\s\sn)?\s\s*/',\n handler: syntaxify.handleSpanClass\n},{\n name: "doubleQuotedString",\n match: "\s"(?:\s\s\s\s.|[^\s\s\s\s\s"])*?\s"",\n handler: syntaxify.handleSpanClass\n},{\n name: "singleQuotedString",\n match: "'(?:\s\s\s\s.|[^\s\s\s\s'])*?'",\n handler: syntaxify.handleSpanClass\n},{ \n name: "blockDelimiter",\n match: "[{}]",\n simple: true,\n handler: syntaxify.handleSpanClass\n},{ \n name: "groupDelimiter",\n match: "[\s\s(\s\s)]",\n simple: true,\n handler: syntaxify.handleSpanClass\n}];\nsyntaxify.jsFormatters = syntaxify.commonFormatters;\nsyntaxify.jsFormatters = syntaxify.jsFormatters.concat(syntaxify.commonClikeFormatters);\nsyntaxify.jsFormatters = syntaxify.jsFormatters.concat([\n{\n name: "singleLineComment",\n match: '//.*$',\n handler: syntaxify.handleSpanClass\n},{\n name: "keyword",\n match: "\s\sb(?:"+syntaxify.jsKeywords.join("|")+")\s\sb",\n simple: true,\n handler: syntaxify.handleSpanClass\n},{ \n name: "number",\n match: "\s\sb(?:\s\sd+|\s\sd+\s\s.\s\sd+[eE][\s\s+-]\s\sd+)\s\sb",\n simple: true,\n handler: syntaxify.handleSpanClass\n}]);\n\nsyntaxify.xmlFormatters = syntaxify.commonFormatters;\nsyntaxify.xmlFormatters = syntaxify.xmlFormatters.concat([\n{\n name: "cdata",\n match: '<\s\s!\s\s[[\s\sw\s\ss]*?\s\s[(?:(?:.|(?:\s\sr)?\s\sn)(?!\s\s]\s\s]>))*?(?:(?:.|(?:\s\sr)?\s\sn)(?=\s\s]\s\s]>))?\s\s]\s\s]>',\n handler: syntaxify.handleSpanClass\n},{\n name: "multiLineComment",\n match: "<[^!>]*!--\s\ss*(?:(?:.|(?:\s\sr)?\s\sn)(?!--))*?(?:(?:.|(?:\s\sr)?\s\sn)(?=--))?\s\ss*--[^>]*?>",\n handler: syntaxify.handleSpanClass\n},{\n name: "tag",\n match: "<[/\s\s?]?[^>]*?>",\n handler: function(w) {\n var formatter = new Formatter(syntaxify.xmlTagFormatters);\n var wikifier = new Wikifier(w.matchText, formatter, w.highlightRegExp, w.output);\n wikifier.subWikify(w.output, null);\n }\n}]);\n\nsyntaxify.xmlTagFormatters = syntaxify.commonFormatters;\nsyntaxify.xmlTagFormatters = syntaxify.xmlTagFormatters.concat([\n{ name: "tagname",\n match: '<[/\s\s?]?\s\ss*(?:[\s\sw-\s\s.]+)',\n lookahead: '(<[/\s\s?]?\s\ss*)([\s\sw-\s\s.]+)',\n handler: syntaxify.handleSpanClass\n},{\n name: "attribute-value",\n match: '[\s\sw-\s.]+(?:\s\ss*=\s\ss*"[^"]*?"|\s'[^\s']*?\s'|\s\sw+)?',\n lookahead: '([\s\sw-\s.]+)(?:(\s\ss*=\s\ss*)("[^"]*?"|\s'[^\s']*?\s'|\s\sw+))?',\n handler: function(w) {\n var lookaheadRegExp = new RegExp(this.lookahead,"mg"); \n lookaheadRegExp.lastIndex = w.matchStart; \n var lookaheadMatch = lookaheadRegExp.exec(w.source); \n if(lookaheadMatch && lookaheadMatch.index == w.matchStart) { \n var e = createTiddlyElement(w.output, "span", null, "attribute");\n e.innerHTML = this.simple?lookaheadMatch[1]:lookaheadMatch[1].htmlFix();\n if(lookaheadMatch[2]) {\n var e = createTiddlyElement(w.output, "span");\n e.innerHTML = this.simple?lookaheadMatch[2]:lookaheadMatch[2].htmlFix();\n e = createTiddlyElement(w.output, "span", null, "value");\n e.innerHTML = this.simple?lookaheadMatch[3]:lookaheadMatch[3].htmlFix();\n }\n }\n w.nextMatch = lookaheadMatch.index + lookaheadMatch[0].length; \n }\n}]);\n\nsyntaxify.cssFormatters = syntaxify.commonFormatters;\nsyntaxify.cssFormatters = syntaxify.cssFormatters.concat(syntaxify.commonClikeFormatters);\nsyntaxify.cssFormatters = syntaxify.cssFormatters.concat([\n{ name: "keyword",\n match: "\s\sb(?:"+syntaxify.cssKeywords.join("|")+")\s\sb",\n simple: true,\n handler: syntaxify.handleSpanClass\n},{\n name: "value",\n match: "\s\sb(?:"+syntaxify.cssValues.join("|")+")\s\sb",\n simple: true,\n handler: syntaxify.handleSpanClass\n},{\n name: "number",\n match: "\s\sb\s\sd+(?:\s\s.\s\sd+)?(?:em|pt|px|cm|in|pc|mm)\s\sb",\n simple: true,\n handler: syntaxify.handleSpanClass\n},{\n name: "font",\n match: "\s\sb(?:"+syntaxify.cssFonts.join("|")+")\s\sb",\n simple: true,\n handler: syntaxify.handleSpanClass\n},{\n name: "color",\n match: '(?:\s\s#[a-zA-Z0-9]{6}\s\sb|\s\s#[a-zA-Z0-9]{3}\s\sb|rgb\s\s(\s\ss*\s\sd+\s\ss*,\s\ss*\s\sd+\s\ss*,\s\ss*\s\sd+\s\ss*\s\s))',\n handler: syntaxify.handleSpanClass\n},{ \n name: "important",\n match: "!\s\ss*important",\n handler: syntaxify.handleSpanClass\n},{ \n name: "class",\n match: "\s\s.\s\sw+",\n simple: true,\n handler: syntaxify.handleSpanClass\n},{ \n name: "id",\n match: "\s\s#\s\sw+",\n simple: true,\n handler: syntaxify.handleSpanClass\n}]);\n\nconfig.formatterHelpers.monospacedByLineHelper = function(w) { \n var lookaheadRegExp = new RegExp(this.lookahead,"mg"); \n lookaheadRegExp.lastIndex = w.matchStart; \n var lookaheadMatch = lookaheadRegExp.exec(w.source); \n if(lookaheadMatch && lookaheadMatch.index == w.matchStart) { \n var text = lookaheadMatch[1]; \n if(config.browser.isIE) text = text.replace(/\sn/g,"\sr"); \n if(this.formatters) {\n var d = createTiddlyElement(w.output,"div",null,"syntaxify");\n var l = createTiddlyElement(d,"ol");\n var li = createTiddlyElement(l,"li");\n var formatter = new Formatter(this.formatters);\n var wikifier = new Wikifier(text, formatter, w.highlightRegExp, li);\n wikifier.subWikify(li, null);\n if(!l.childNodes[l.childNodes.length-1].hasChildNodes())\n l.removeChild(l.childNodes[l.childNodes.length-1]);\n } else { \n var e = createTiddlyElement(w.output,"pre",null,null,text); \n } \n w.nextMatch = lookaheadMatch.index + lookaheadMatch[0].length; \n } \n} \n \nfor(var i=0;i<config.formatters.length;i++) { \n if(config.formatters[i].name == "monospacedByLineForCSS") { \n config.formatters[i].formatters = syntaxify.cssFormatters;\n config.formatters[i].handler = config.formatterHelpers.monospacedByLineHelper; \n } \n if(config.formatters[i].name == "monospacedByLineForPlugin") { \n config.formatters[i].formatters = syntaxify.jsFormatters;\n config.formatters[i].handler = config.formatterHelpers.monospacedByLineHelper; \n } \n if(config.formatters[i].name == "monospacedByLineForTemplate") { \n config.formatters[i].formatters = syntaxify.xmlFormatters; \n config.formatters[i].handler = config.formatterHelpers.monospacedByLineHelper; \n } \n} \n\n//}}}
It is recommended that [[Plugins]] start with some standard information in TiddlerSlicing format. For example, see the ExamplePlugin:\n{{{\n|''Name:''|ExamplePlugin|\n|''Description:''|To demonstrate how to write TiddlyWiki plugins|\n|''Version:''|2.0.2|\n|''Date:''|Jul 12, 2006|\n|''Source:''|http://www.tiddlywiki.com/#ExamplePlugin|\n|''Author:''|JeremyRuston (jeremy (at) osmosoft (dot) com)|\n|''License:''|[[BSD open source license]]|\n|''~CoreVersion:''|2.1.0|\n|''Browser:''|Firefox 1.0.4+; Firefox 1.5; InternetExplorer 6.0|\n}}}\nAt the moment, only ~CoreVersion affects how [[Plugins]] are processed: if the ~CoreVersion is specified for a plugin, TiddlyWiki will only execute the plugin if the core code version matches or exceeds the version specified. For example, if you specify a ~CoreVersion of 2.2, version 2.1.x of TiddlyWiki will refuse to execute the plugin.\n\nTiddlyWiki executes [[Plugins]] by wrapping them in a function definition like this:\n{{{\nfunction(tiddler,pluginInfo)\n{\n[[Plugin code is spliced into place here]]\n}\n}}}\nThe available parameters are:\n|tiddler |A reference to the {{{TIddler()}}} object containing this plugin|\n|pluginInfo |A member of the {{{pluginError[]}}} global array containing the metadata about this plugin: Name, Description, Version, ~CoreVersion, Date, Source, Author, License, Browsers, title, log |\n{{{pluginInfo.log}}} is a string array that can have additional log strings pushed onto it.\n\nNote that [[Plugins]] can use the {{{return}}} statement to bail out early (the return value is ignored). To indicate an error, plugins should just {{{throw}}} an exception.
This {{{<<plugins>>}}} macro is intended to provide a kind of control panel for TiddlyWiki plugins. From here you can see what [[Plugins]] are loaded, examine their status and disable or force execution as required.\n\nAs part of this change, new PluginFormat has been introduced that uses TiddlerSlicing to define some standardised information to describe a plugin.\n\n<<plugins>>
newest at the top
/***\n| Name:|QuickOpenTagPlugin|\n| Description:|Changes tag links to make it easier to open tags as tiddlers|\n| Version:|2.0.0|\n| Date:|21-Sep-2006|\n| Source:|http://mptw.tiddlyspot.com/#QuickOpenTagPlugin|\n| Author:|Simon Baird <simon.baird@gmail.com>|\n| CoreVersion:|2.1.x|\n***/\n//{{{\n\nconfig.quickOpenTag = {\n\n dropdownChar: (document.all ? "\su25bc" : "\su25be"), // the little one doesn't work in IE\n\n createTagButton: function(place,tag,excludeTiddler) {\n var sp = createTiddlyElement(place,"span",null,"quickopentag");\n createTiddlyLink(sp,tag,true,"button");\n var theTag = createTiddlyButton(sp,config.quickOpenTag.dropdownChar,\n config.views.wikified.tag.tooltip.format([tag]),onClickTag);\n theTag.setAttribute("tag",tag);\n if (excludeTiddler)\n theTag.setAttribute("tiddler",excludeTiddler);\n return(theTag);\n },\n\n miniTagHandler: function(place,macroName,params,wikifier,paramString,tiddler) {\n var tagged = store.getTaggedTiddlers(tiddler.title);\n if (tagged.length > 0) {\n var theTag = createTiddlyButton(place,config.quickOpenTag.dropdownChar,\n config.views.wikified.tag.tooltip.format([tiddler.title]),onClickTag);\n theTag.setAttribute("tag",tiddler.title);\n theTag.className = "miniTag";\n }\n },\n\n allTagsHandler: function(place,macroName,params) {\n var tags = store.getTags();\n var theDateList = createTiddlyElement(place,"ul");\n if(tags.length == 0)\n createTiddlyElement(theDateList,"li",null,"listTitle",this.noTags);\n for (var t=0; t<tags.length; t++) {\n var theListItem = createTiddlyElement(theDateList,"li");\n var theLink = createTiddlyLink(theListItem,tags[t][0],true);\n var theCount = " (" + tags[t][1] + ")";\n theLink.appendChild(document.createTextNode(theCount));\n var theDropDownBtn = createTiddlyButton(theListItem," " +\n config.quickOpenTag.dropdownChar,this.tooltip.format([tags[t][0]]),onClickTag);\n theDropDownBtn.setAttribute("tag",tags[t][0]);\n }\n },\n\n // todo fix these up a bit\n styles: \n".tagglyTagged .quickopentag, .tagged .quickopentag \sn"+\n" { margin-right:1.2em; border:1px solid #eee; padding:2px; padding-right:0px; padding-left:1px; }\sn"+\n".quickopentag .tiddlyLink { padding:2px; padding-left:3px; }\sn"+\n".quickopentag a.button { padding:1px; padding-left:2px; padding-right:2px;}\sn"+\n// extra specificity to make it work?\n"#displayArea .viewer .quickopentag a.button, \sn"+\n"#displayArea .viewer .quickopentag a.tiddyLink, \sn"+\n"#mainMenu .quickopentag a.tiddyLink, \sn"+\n"#mainMenu .quickopentag a.tiddyLink \sn"+\n" { border:0px solid black; }\sn"+\n"#displayArea .viewer .quickopentag a.button, \sn"+\n"#mainMenu .quickopentag a.button \sn"+\n" { margin-left:0px; padding-left:2px; }\sn"+\n"#displayArea .viewer .quickopentag a.tiddlyLink, \sn"+\n"#mainMenu .quickopentag a.tiddlyLink \sn"+\n" { margin-right:0px; padding-right:0px; padding-left:0px; margin-left:0px; }\sn"+\n"a.miniTag {font-size:150%;} \sn"+\n"#mainMenu .quickopentag a.button \sn"+\n// looks better in right justified main menus\n"{ margin-left:0px; padding-left:2px; margin-right:0px; padding-right:0px; }\sn" + \n "",\n\n init: function() {\n // we fully replace these builtins. can't hijack them easily\n window.createTagButton = this.createTagButton;\n config.macros.allTags.handler = this.allTagsHandler;\n config.macros.miniTag = { handler: this.miniTagHandler };\n config.shadowTiddlers.mptwQuickOpenTagStyles = this.styles;\n config.notifyTiddlers.push({name:"mptwQuickOpenTagStyles", notify: refreshStyles});\n }\n\n}\n\nconfig.quickOpenTag.init();\n\n//}}}\n\n
This is tagged with hasDate so it has a date. Would be excellent for GTD ticklers. You could set a tickle date and have it tickle you at the right time.
/***\n| Name:|RenameTagsPlugin|\n| Purpose:|Allows you to easily rename tags|\n| Creator:|SimonBaird|\n| Source:|http://simonbaird.com/mptw/#RenameTagsPlugin|\n| Version:|1.0.1 (5-Mar-06)|\n\n!Description\nIf you rename a tiddler/tag that is tagging other tiddlers this plugin will ask you if you want to rename the tag in each tiddler where it is used. This is essential if you use tags and ever want to rename them. To use it, open the tag you want to rename as a tiddler (it's the last option in the tag popup menu), edit it, rename it and click done. You will asked if you want to rename the tag. Click OK to rename the tag in the tiddlers that use it. Click Cancel to not rename the tag.\n\n!Example\nTry renaming [[Plugins]] or [[CSS]] on this site.\n\n!History\n* 1.0.1 (5-Mar-06) - Added feature to allow renaming of tags without side-effect of creating a tiddler\n* 1.0.0 (5-Mar-06) - First working version\n\n!Code\n***/\n//{{{\n\nversion.extensions.RenameTagsPlugin = {\n major: 1, minor: 0, revision: 0,\n date: new Date(2006,3,5),\n source: "http://simonbaird.com/mptw/#RenameTagsPlugin"\n};\n\nconfig.macros.RenameTagsPlugin = {};\nconfig.macros.RenameTagsPlugin.prompt = "Rename the tag '%0' to '%1' in %2 tidder%3?";\n\n// these are very useful, perhaps they should be in the core\nif (!TiddlyWiki.prototype.addTag) {\n TiddlyWiki.prototype.addTag = function(title,tag) {\n var t=this.getTiddler(title); if (!t || !t.tags) return;\n t.tags.push(tag);\n };\n};\n\nif (!TiddlyWiki.prototype.removeTag) {\n TiddlyWiki.prototype.removeTag = function(title,tag) {\n var t=this.getTiddler(title); if (!t || !t.tags) return;\n if (t.tags.find(tag)!=null) t.tags.splice(t.tags.find(tag),1);\n };\n};\n\nTiddlyWiki.prototype.saveTiddler_orig_tagrename = store.saveTiddler;\nTiddlyWiki.prototype.saveTiddler = function(title,newTitle,newBody,modifier,modified,tags) {\n if (title != newTitle && this.getTaggedTiddlers(title).length > 0) {\n // then we are renaming a tag\n var tagged = this.getTaggedTiddlers(title);\n if (confirm(config.macros.RenameTagsPlugin.prompt.format([title,newTitle,tagged.length,tagged.length>1?"s":""]))) {\n for (var i=0;i<tagged.length;i++) {\n store.removeTag(tagged[i].title,title);\n store.addTag(tagged[i].title,newTitle);\n // if tiddler is visible refresh it to show updated tag\n story.refreshTiddler(tagged[i].title,false,true);\n }\n }\n if (!this.tiddlerExists(title) && newBody == "") {\n // dont create unwanted tiddler\n return null;\n }\n }\n return this.saveTiddler_orig_tagrename(title,newTitle,newBody,modifier,modified,tags);\n}\n\n//}}}\n\n
This is a great big lump of content to stretch the startup time so it's easier to see the impact of optimisations. Note that the current tab will also have an impact on the rendering time of the page. It's suggested that timings be taken on the More/Shadowed tab as a baseline.\n----\nLike most wikis, TiddlyWiki supports a range of simplified character formatting:\n| !To get | !Type this |h\n| ''Bold'' | {{{''Bold''}}} |\n| ==Strikethrough== | {{{==Strikethrough==}}} |\n| __Underline__ | {{{__Underline__}}} (that's two underline characters) |\n| //Italic// | {{{//Italic//}}} |\n| Superscript: 2^^3^^=8 | {{{2^^3^^=8}}} |\n| Subscript: a~~ij~~ = -a~~ji~~ | {{{a~~ij~~ = -a~~ji~~}}} |\n| @@highlight@@ | {{{@@highlight@@}}} |\n<<<\nThe highlight can also accept CSS syntax to directly style the text:\n@@color:green;green coloured@@\n@@background-color:#ff0000;color:#ffffff;red coloured@@\n@@text-shadow:black 3px 3px 8px;font-size:18pt;display:block;margin:1em 1em 1em 1em;border:1px solid black;Access any CSS style@@\n<<<\nLike most wikis, TiddlyWiki supports a range of simplified character formatting:\n| !To get | !Type this |h\n| ''Bold'' | {{{''Bold''}}} |\n| ==Strikethrough== | {{{==Strikethrough==}}} |\n| __Underline__ | {{{__Underline__}}} (that's two underline characters) |\n| //Italic// | {{{//Italic//}}} |\n| Superscript: 2^^3^^=8 | {{{2^^3^^=8}}} |\n| Subscript: a~~ij~~ = -a~~ji~~ | {{{a~~ij~~ = -a~~ji~~}}} |\n| @@highlight@@ | {{{@@highlight@@}}} |\n<<<\nThe highlight can also accept CSS syntax to directly style the text:\n@@color:green;green coloured@@\n@@background-color:#ff0000;color:#ffffff;red coloured@@\n@@text-shadow:black 3px 3px 8px;font-size:18pt;display:block;margin:1em 1em 1em 1em;border:1px solid black;Access any CSS style@@\n<<<\nLike most wikis, TiddlyWiki supports a range of simplified character formatting:\n| !To get | !Type this |h\n| ''Bold'' | {{{''Bold''}}} |\n| ==Strikethrough== | {{{==Strikethrough==}}} |\n| __Underline__ | {{{__Underline__}}} (that's two underline characters) |\n| //Italic// | {{{//Italic//}}} |\n| Superscript: 2^^3^^=8 | {{{2^^3^^=8}}} |\n| Subscript: a~~ij~~ = -a~~ji~~ | {{{a~~ij~~ = -a~~ji~~}}} |\n| @@highlight@@ | {{{@@highlight@@}}} |\n<<<\nThe highlight can also accept CSS syntax to directly style the text:\n@@color:green;green coloured@@\n@@background-color:#ff0000;color:#ffffff;red coloured@@\n@@text-shadow:black 3px 3px 8px;font-size:18pt;display:block;margin:1em 1em 1em 1em;border:1px solid black;Access any CSS style@@\n<<<\n|Standard Periodic Table (ref. Wikipedia)|c\n|| !1 | !2 |!| !3 | !4 | !5 | !6 | !7 | !8 | !9 | !10 | !11 | !12 | !13 | !14 | !15 | !16 | !17 | !18 |\n|!1|bgcolor(#a0ffa0): @@color(red):H@@ |>|>|>|>|>|>|>|>|>|>|>|>|>|>|>|>||bgcolor(#c0ffff): @@color(red):He@@ |\n|!2|bgcolor(#ff6666): Li |bgcolor(#ffdead): Be |>|>|>|>|>|>|>|>|>|>||bgcolor(#cccc99): B |bgcolor(#a0ffa0): C |bgcolor(#a0ffa0): @@color(red):N@@ |bgcolor(#a0ffa0): @@color(red):O@@ |bgcolor(#ffff99): @@color(red):F@@ |bgcolor(#c0ffff): @@color(red):Ne@@ |\n|!3|bgcolor(#ff6666): Na |bgcolor(#ffdead): Mg |>|>|>|>|>|>|>|>|>|>||bgcolor(#cccccc): Al |bgcolor(#cccc99): Si |bgcolor(#a0ffa0): P |bgcolor(#a0ffa0): S |bgcolor(#ffff99): @@color(red):Cl@@ |bgcolor(#c0ffff): @@color(red):Ar@@ |\n|!4|bgcolor(#ff6666): K |bgcolor(#ffdead): Ca ||bgcolor(#ffc0c0): Sc |bgcolor(#ffc0c0): Ti |bgcolor(#ffc0c0): V |bgcolor(#ffc0c0): Cr |bgcolor(#ffc0c0): Mn |bgcolor(#ffc0c0): Fe |bgcolor(#ffc0c0): Co |bgcolor(#ffc0c0): Ni |bgcolor(#ffc0c0): Cu |bgcolor(#ffc0c0): Zn |bgcolor(#cccccc): Ga |bgcolor(#cccc99): Ge |bgcolor(#cccc99): As |bgcolor(#a0ffa0): Se |bgcolor(#ffff99): @@color(green):Br@@ |bgcolor(#c0ffff): @@color(red):Kr@@ |\n|!5|bgcolor(#ff6666): Rb |bgcolor(#ffdead): Sr ||bgcolor(#ffc0c0): Y |bgcolor(#ffc0c0): Zr |bgcolor(#ffc0c0): Nb |bgcolor(#ffc0c0): Mo |bgcolor(#ffc0c0): Tc |bgcolor(#ffc0c0): Ru |bgcolor(#ffc0c0): Rh |bgcolor(#ffc0c0): Pd |bgcolor(#ffc0c0): Ag |bgcolor(#ffc0c0): Cd |bgcolor(#cccccc): In |bgcolor(#cccccc): Sn |bgcolor(#cccc99): Sb |bgcolor(#cccc99): Te |bgcolor(#ffff99): I |bgcolor(#c0ffff): @@color(red):Xe@@ |\n|!6|bgcolor(#ff6666): Cs |bgcolor(#ffdead): Ba |bgcolor(#ffbfff):^^*1^^|bgcolor(#ffc0c0): Lu |bgcolor(#ffc0c0): Hf |bgcolor(#ffc0c0): Ta |bgcolor(#ffc0c0): W |bgcolor(#ffc0c0): Re |bgcolor(#ffc0c0): Os |bgcolor(#ffc0c0): Ir |bgcolor(#ffc0c0): Pt |bgcolor(#ffc0c0): Au |bgcolor(#ffc0c0): @@color(green):Hg@@ |bgcolor(#cccccc): Tl |bgcolor(#cccccc): Pb |bgcolor(#cccccc): Bi |bgcolor(#cccc99): Po |bgcolor(#ffff99): At |bgcolor(#c0ffff): @@color(red):Rn@@ |\n|!7|bgcolor(#ff6666): Fr |bgcolor(#ffdead): Ra |bgcolor(#ff99cc):^^*2^^|bgcolor(#ffc0c0): Lr |bgcolor(#ffc0c0): Rf |bgcolor(#ffc0c0): Db |bgcolor(#ffc0c0): Sq |bgcolor(#ffc0c0): Bh |bgcolor(#ffc0c0): Hs |bgcolor(#ffc0c0): Mt |bgcolor(#ffc0c0): Ds |bgcolor(#ffc0c0): Rg |bgcolor(#ffc0c0): @@color(green):Uub@@ |bgcolor(#cccccc): Uut |bgcolor(#cccccc): Uuq |bgcolor(#cccccc): Uup |bgcolor(#cccccc): Uuh |bgcolor(#fcfecc): @@color(#cccccc):Uus@@ |bgcolor(#ecfefc): @@color(#cccccc):Uuo@@ |\n\n| !Lanthanides^^*1^^|bgcolor(#ffbfff): La |bgcolor(#ffbfff): Ce |bgcolor(#ffbfff): Pr |bgcolor(#ffbfff): Nd |bgcolor(#ffbfff): Pm |bgcolor(#ffbfff): Sm |bgcolor(#ffbfff): Eu |bgcolor(#ffbfff): Gd |bgcolor(#ffbfff): Tb |bgcolor(#ffbfff): Dy |bgcolor(#ffbfff): Ho |bgcolor(#ffbfff): Er |bgcolor(#ffbfff): Tm |bgcolor(#ffbfff): Yb |\n| !Actinides^^*2^^|bgcolor(#ff99cc): Ac |bgcolor(#ff99cc): Th |bgcolor(#ff99cc): Pa |bgcolor(#ff99cc): U |bgcolor(#ff99cc): Np |bgcolor(#ff99cc): Pu |bgcolor(#ff99cc): Am |bgcolor(#ff99cc): Cm |bgcolor(#ff99cc): Bk |bgcolor(#ff99cc): Cf |bgcolor(#ff99cc): Es |bgcolor(#ff99cc): Fm |bgcolor(#ff99cc): Md |bgcolor(#ff99cc): No |\n\n*Chemical Series of the Periodic Table\n**@@bgcolor(#ff6666): Alkali metals@@\n**@@bgcolor(#ffdead): Alkaline earth metals@@\n**@@bgcolor(#ffbfff): Lanthanides@@\n**@@bgcolor(#ff99cc): Actinides@@\n**@@bgcolor(#ffc0c0): Transition metals@@\n**@@bgcolor(#cccccc): Poor metals@@\n**@@bgcolor(#cccc99): Metalloids@@\n**@@bgcolor(#a0ffa0): Nonmetals@@\n**@@bgcolor(#ffff99): Halogens@@\n**@@bgcolor(#c0ffff): Noble gases@@\n\n*State at standard temperature and pressure\n**those in @@color(red):red@@ are gases\n**those in @@color(green):green@@ are liquids\n**those in black are solids\nLike most wikis, TiddlyWiki supports a range of simplified character formatting:\n| !To get | !Type this |h\n| ''Bold'' | {{{''Bold''}}} |\n| ==Strikethrough== | {{{==Strikethrough==}}} |\n| __Underline__ | {{{__Underline__}}} (that's two underline characters) |\n| //Italic// | {{{//Italic//}}} |\n| Superscript: 2^^3^^=8 | {{{2^^3^^=8}}} |\n| Subscript: a~~ij~~ = -a~~ji~~ | {{{a~~ij~~ = -a~~ji~~}}} |\n| @@highlight@@ | {{{@@highlight@@}}} |\n<<<\nThe highlight can also accept CSS syntax to directly style the text:\n@@color:green;green coloured@@\n@@background-color:#ff0000;color:#ffffff;red coloured@@\n@@text-shadow:black 3px 3px 8px;font-size:18pt;display:block;margin:1em 1em 1em 1em;border:1px solid black;Access any CSS style@@\n<<<\nLike most wikis, TiddlyWiki supports a range of simplified character formatting:\n| !To get | !Type this |h\n| ''Bold'' | {{{''Bold''}}} |\n| ==Strikethrough== | {{{==Strikethrough==}}} |\n| __Underline__ | {{{__Underline__}}} (that's two underline characters) |\n| //Italic// | {{{//Italic//}}} |\n| Superscript: 2^^3^^=8 | {{{2^^3^^=8}}} |\n| Subscript: a~~ij~~ = -a~~ji~~ | {{{a~~ij~~ = -a~~ji~~}}} |\n| @@highlight@@ | {{{@@highlight@@}}} |\n<<<\nThe highlight can also accept CSS syntax to directly style the text:\n@@color:green;green coloured@@\n@@background-color:#ff0000;color:#ffffff;red coloured@@\n@@text-shadow:black 3px 3px 8px;font-size:18pt;display:block;margin:1em 1em 1em 1em;border:1px solid black;Access any CSS style@@\n<<<\nLike most wikis, TiddlyWiki supports a range of simplified character formatting:\n| !To get | !Type this |h\n| ''Bold'' | {{{''Bold''}}} |\n| ==Strikethrough== | {{{==Strikethrough==}}} |\n| __Underline__ | {{{__Underline__}}} (that's two underline characters) |\n| //Italic// | {{{//Italic//}}} |\n| Superscript: 2^^3^^=8 | {{{2^^3^^=8}}} |\n| Subscript: a~~ij~~ = -a~~ji~~ | {{{a~~ij~~ = -a~~ji~~}}} |\n| @@highlight@@ | {{{@@highlight@@}}} |\n<<<\nThe highlight can also accept CSS syntax to directly style the text:\n@@color:green;green coloured@@\n@@background-color:#ff0000;color:#ffffff;red coloured@@\n@@text-shadow:black 3px 3px 8px;font-size:18pt;display:block;margin:1em 1em 1em 1em;border:1px solid black;Access any CSS style@@\n<<<\n|Standard Periodic Table (ref. Wikipedia)|c\n|| !1 | !2 |!| !3 | !4 | !5 | !6 | !7 | !8 | !9 | !10 | !11 | !12 | !13 | !14 | !15 | !16 | !17 | !18 |\n|!1|bgcolor(#a0ffa0): @@color(red):H@@ |>|>|>|>|>|>|>|>|>|>|>|>|>|>|>|>||bgcolor(#c0ffff): @@color(red):He@@ |\n|!2|bgcolor(#ff6666): Li |bgcolor(#ffdead): Be |>|>|>|>|>|>|>|>|>|>||bgcolor(#cccc99): B |bgcolor(#a0ffa0): C |bgcolor(#a0ffa0): @@color(red):N@@ |bgcolor(#a0ffa0): @@color(red):O@@ |bgcolor(#ffff99): @@color(red):F@@ |bgcolor(#c0ffff): @@color(red):Ne@@ |\n|!3|bgcolor(#ff6666): Na |bgcolor(#ffdead): Mg |>|>|>|>|>|>|>|>|>|>||bgcolor(#cccccc): Al |bgcolor(#cccc99): Si |bgcolor(#a0ffa0): P |bgcolor(#a0ffa0): S |bgcolor(#ffff99): @@color(red):Cl@@ |bgcolor(#c0ffff): @@color(red):Ar@@ |\n|!4|bgcolor(#ff6666): K |bgcolor(#ffdead): Ca ||bgcolor(#ffc0c0): Sc |bgcolor(#ffc0c0): Ti |bgcolor(#ffc0c0): V |bgcolor(#ffc0c0): Cr |bgcolor(#ffc0c0): Mn |bgcolor(#ffc0c0): Fe |bgcolor(#ffc0c0): Co |bgcolor(#ffc0c0): Ni |bgcolor(#ffc0c0): Cu |bgcolor(#ffc0c0): Zn |bgcolor(#cccccc): Ga |bgcolor(#cccc99): Ge |bgcolor(#cccc99): As |bgcolor(#a0ffa0): Se |bgcolor(#ffff99): @@color(green):Br@@ |bgcolor(#c0ffff): @@color(red):Kr@@ |\n|!5|bgcolor(#ff6666): Rb |bgcolor(#ffdead): Sr ||bgcolor(#ffc0c0): Y |bgcolor(#ffc0c0): Zr |bgcolor(#ffc0c0): Nb |bgcolor(#ffc0c0): Mo |bgcolor(#ffc0c0): Tc |bgcolor(#ffc0c0): Ru |bgcolor(#ffc0c0): Rh |bgcolor(#ffc0c0): Pd |bgcolor(#ffc0c0): Ag |bgcolor(#ffc0c0): Cd |bgcolor(#cccccc): In |bgcolor(#cccccc): Sn |bgcolor(#cccc99): Sb |bgcolor(#cccc99): Te |bgcolor(#ffff99): I |bgcolor(#c0ffff): @@color(red):Xe@@ |\n|!6|bgcolor(#ff6666): Cs |bgcolor(#ffdead): Ba |bgcolor(#ffbfff):^^*1^^|bgcolor(#ffc0c0): Lu |bgcolor(#ffc0c0): Hf |bgcolor(#ffc0c0): Ta |bgcolor(#ffc0c0): W |bgcolor(#ffc0c0): Re |bgcolor(#ffc0c0): Os |bgcolor(#ffc0c0): Ir |bgcolor(#ffc0c0): Pt |bgcolor(#ffc0c0): Au |bgcolor(#ffc0c0): @@color(green):Hg@@ |bgcolor(#cccccc): Tl |bgcolor(#cccccc): Pb |bgcolor(#cccccc): Bi |bgcolor(#cccc99): Po |bgcolor(#ffff99): At |bgcolor(#c0ffff): @@color(red):Rn@@ |\n|!7|bgcolor(#ff6666): Fr |bgcolor(#ffdead): Ra |bgcolor(#ff99cc):^^*2^^|bgcolor(#ffc0c0): Lr |bgcolor(#ffc0c0): Rf |bgcolor(#ffc0c0): Db |bgcolor(#ffc0c0): Sq |bgcolor(#ffc0c0): Bh |bgcolor(#ffc0c0): Hs |bgcolor(#ffc0c0): Mt |bgcolor(#ffc0c0): Ds |bgcolor(#ffc0c0): Rg |bgcolor(#ffc0c0): @@color(green):Uub@@ |bgcolor(#cccccc): Uut |bgcolor(#cccccc): Uuq |bgcolor(#cccccc): Uup |bgcolor(#cccccc): Uuh |bgcolor(#fcfecc): @@color(#cccccc):Uus@@ |bgcolor(#ecfefc): @@color(#cccccc):Uuo@@ |\n\n| !Lanthanides^^*1^^|bgcolor(#ffbfff): La |bgcolor(#ffbfff): Ce |bgcolor(#ffbfff): Pr |bgcolor(#ffbfff): Nd |bgcolor(#ffbfff): Pm |bgcolor(#ffbfff): Sm |bgcolor(#ffbfff): Eu |bgcolor(#ffbfff): Gd |bgcolor(#ffbfff): Tb |bgcolor(#ffbfff): Dy |bgcolor(#ffbfff): Ho |bgcolor(#ffbfff): Er |bgcolor(#ffbfff): Tm |bgcolor(#ffbfff): Yb |\n| !Actinides^^*2^^|bgcolor(#ff99cc): Ac |bgcolor(#ff99cc): Th |bgcolor(#ff99cc): Pa |bgcolor(#ff99cc): U |bgcolor(#ff99cc): Np |bgcolor(#ff99cc): Pu |bgcolor(#ff99cc): Am |bgcolor(#ff99cc): Cm |bgcolor(#ff99cc): Bk |bgcolor(#ff99cc): Cf |bgcolor(#ff99cc): Es |bgcolor(#ff99cc): Fm |bgcolor(#ff99cc): Md |bgcolor(#ff99cc): No |\n\n*Chemical Series of the Periodic Table\n**@@bgcolor(#ff6666): Alkali metals@@\n**@@bgcolor(#ffdead): Alkaline earth metals@@\n**@@bgcolor(#ffbfff): Lanthanides@@\n**@@bgcolor(#ff99cc): Actinides@@\n**@@bgcolor(#ffc0c0): Transition metals@@\n**@@bgcolor(#cccccc): Poor metals@@\n**@@bgcolor(#cccc99): Metalloids@@\n**@@bgcolor(#a0ffa0): Nonmetals@@\n**@@bgcolor(#ffff99): Halogens@@\n**@@bgcolor(#c0ffff): Noble gases@@\n\n*State at standard temperature and pressure\n**those in @@color(red):red@@ are gases\n**those in @@color(green):green@@ are liquids\n**those in black are solids\nLike most wikis, TiddlyWiki supports a range of simplified character formatting:\n| !To get | !Type this |h\n| ''Bold'' | {{{''Bold''}}} |\n| ==Strikethrough== | {{{==Strikethrough==}}} |\n| __Underline__ | {{{__Underline__}}} (that's two underline characters) |\n| //Italic// | {{{//Italic//}}} |\n| Superscript: 2^^3^^=8 | {{{2^^3^^=8}}} |\n| Subscript: a~~ij~~ = -a~~ji~~ | {{{a~~ij~~ = -a~~ji~~}}} |\n| @@highlight@@ | {{{@@highlight@@}}} |\n<<<\nThe highlight can also accept CSS syntax to directly style the text:\n@@color:green;green coloured@@\n@@background-color:#ff0000;color:#ffffff;red coloured@@\n@@text-shadow:black 3px 3px 8px;font-size:18pt;display:block;margin:1em 1em 1em 1em;border:1px solid black;Access any CSS style@@\n<<<\nLike most wikis, TiddlyWiki supports a range of simplified character formatting:\n| !To get | !Type this |h\n| ''Bold'' | {{{''Bold''}}} |\n| ==Strikethrough== | {{{==Strikethrough==}}} |\n| __Underline__ | {{{__Underline__}}} (that's two underline characters) |\n| //Italic// | {{{//Italic//}}} |\n| Superscript: 2^^3^^=8 | {{{2^^3^^=8}}} |\n| Subscript: a~~ij~~ = -a~~ji~~ | {{{a~~ij~~ = -a~~ji~~}}} |\n| @@highlight@@ | {{{@@highlight@@}}} |\n<<<\nThe highlight can also accept CSS syntax to directly style the text:\n@@color:green;green coloured@@\n@@background-color:#ff0000;color:#ffffff;red coloured@@\n@@text-shadow:black 3px 3px 8px;font-size:18pt;display:block;margin:1em 1em 1em 1em;border:1px solid black;Access any CSS style@@\n<<<\nLike most wikis, TiddlyWiki supports a range of simplified character formatting:\n| !To get | !Type this |h\n| ''Bold'' | {{{''Bold''}}} |\n| ==Strikethrough== | {{{==Strikethrough==}}} |\n| __Underline__ | {{{__Underline__}}} (that's two underline characters) |\n| //Italic// | {{{//Italic//}}} |\n| Superscript: 2^^3^^=8 | {{{2^^3^^=8}}} |\n| Subscript: a~~ij~~ = -a~~ji~~ | {{{a~~ij~~ = -a~~ji~~}}} |\n| @@highlight@@ | {{{@@highlight@@}}} |\n<<<\nThe highlight can also accept CSS syntax to directly style the text:\n@@color:green;green coloured@@\n@@background-color:#ff0000;color:#ffffff;red coloured@@\n@@text-shadow:black 3px 3px 8px;font-size:18pt;display:block;margin:1em 1em 1em 1em;border:1px solid black;Access any CSS style@@\n<<<\n|Standard Periodic Table (ref. Wikipedia)|c\n|| !1 | !2 |!| !3 | !4 | !5 | !6 | !7 | !8 | !9 | !10 | !11 | !12 | !13 | !14 | !15 | !16 | !17 | !18 |\n|!1|bgcolor(#a0ffa0): @@color(red):H@@ |>|>|>|>|>|>|>|>|>|>|>|>|>|>|>|>||bgcolor(#c0ffff): @@color(red):He@@ |\n|!2|bgcolor(#ff6666): Li |bgcolor(#ffdead): Be |>|>|>|>|>|>|>|>|>|>||bgcolor(#cccc99): B |bgcolor(#a0ffa0): C |bgcolor(#a0ffa0): @@color(red):N@@ |bgcolor(#a0ffa0): @@color(red):O@@ |bgcolor(#ffff99): @@color(red):F@@ |bgcolor(#c0ffff): @@color(red):Ne@@ |\n|!3|bgcolor(#ff6666): Na |bgcolor(#ffdead): Mg |>|>|>|>|>|>|>|>|>|>||bgcolor(#cccccc): Al |bgcolor(#cccc99): Si |bgcolor(#a0ffa0): P |bgcolor(#a0ffa0): S |bgcolor(#ffff99): @@color(red):Cl@@ |bgcolor(#c0ffff): @@color(red):Ar@@ |\n|!4|bgcolor(#ff6666): K |bgcolor(#ffdead): Ca ||bgcolor(#ffc0c0): Sc |bgcolor(#ffc0c0): Ti |bgcolor(#ffc0c0): V |bgcolor(#ffc0c0): Cr |bgcolor(#ffc0c0): Mn |bgcolor(#ffc0c0): Fe |bgcolor(#ffc0c0): Co |bgcolor(#ffc0c0): Ni |bgcolor(#ffc0c0): Cu |bgcolor(#ffc0c0): Zn |bgcolor(#cccccc): Ga |bgcolor(#cccc99): Ge |bgcolor(#cccc99): As |bgcolor(#a0ffa0): Se |bgcolor(#ffff99): @@color(green):Br@@ |bgcolor(#c0ffff): @@color(red):Kr@@ |\n|!5|bgcolor(#ff6666): Rb |bgcolor(#ffdead): Sr ||bgcolor(#ffc0c0): Y |bgcolor(#ffc0c0): Zr |bgcolor(#ffc0c0): Nb |bgcolor(#ffc0c0): Mo |bgcolor(#ffc0c0): Tc |bgcolor(#ffc0c0): Ru |bgcolor(#ffc0c0): Rh |bgcolor(#ffc0c0): Pd |bgcolor(#ffc0c0): Ag |bgcolor(#ffc0c0): Cd |bgcolor(#cccccc): In |bgcolor(#cccccc): Sn |bgcolor(#cccc99): Sb |bgcolor(#cccc99): Te |bgcolor(#ffff99): I |bgcolor(#c0ffff): @@color(red):Xe@@ |\n|!6|bgcolor(#ff6666): Cs |bgcolor(#ffdead): Ba |bgcolor(#ffbfff):^^*1^^|bgcolor(#ffc0c0): Lu |bgcolor(#ffc0c0): Hf |bgcolor(#ffc0c0): Ta |bgcolor(#ffc0c0): W |bgcolor(#ffc0c0): Re |bgcolor(#ffc0c0): Os |bgcolor(#ffc0c0): Ir |bgcolor(#ffc0c0): Pt |bgcolor(#ffc0c0): Au |bgcolor(#ffc0c0): @@color(green):Hg@@ |bgcolor(#cccccc): Tl |bgcolor(#cccccc): Pb |bgcolor(#cccccc): Bi |bgcolor(#cccc99): Po |bgcolor(#ffff99): At |bgcolor(#c0ffff): @@color(red):Rn@@ |\n|!7|bgcolor(#ff6666): Fr |bgcolor(#ffdead): Ra |bgcolor(#ff99cc):^^*2^^|bgcolor(#ffc0c0): Lr |bgcolor(#ffc0c0): Rf |bgcolor(#ffc0c0): Db |bgcolor(#ffc0c0): Sq |bgcolor(#ffc0c0): Bh |bgcolor(#ffc0c0): Hs |bgcolor(#ffc0c0): Mt |bgcolor(#ffc0c0): Ds |bgcolor(#ffc0c0): Rg |bgcolor(#ffc0c0): @@color(green):Uub@@ |bgcolor(#cccccc): Uut |bgcolor(#cccccc): Uuq |bgcolor(#cccccc): Uup |bgcolor(#cccccc): Uuh |bgcolor(#fcfecc): @@color(#cccccc):Uus@@ |bgcolor(#ecfefc): @@color(#cccccc):Uuo@@ |\n\n| !Lanthanides^^*1^^|bgcolor(#ffbfff): La |bgcolor(#ffbfff): Ce |bgcolor(#ffbfff): Pr |bgcolor(#ffbfff): Nd |bgcolor(#ffbfff): Pm |bgcolor(#ffbfff): Sm |bgcolor(#ffbfff): Eu |bgcolor(#ffbfff): Gd |bgcolor(#ffbfff): Tb |bgcolor(#ffbfff): Dy |bgcolor(#ffbfff): Ho |bgcolor(#ffbfff): Er |bgcolor(#ffbfff): Tm |bgcolor(#ffbfff): Yb |\n| !Actinides^^*2^^|bgcolor(#ff99cc): Ac |bgcolor(#ff99cc): Th |bgcolor(#ff99cc): Pa |bgcolor(#ff99cc): U |bgcolor(#ff99cc): Np |bgcolor(#ff99cc): Pu |bgcolor(#ff99cc): Am |bgcolor(#ff99cc): Cm |bgcolor(#ff99cc): Bk |bgcolor(#ff99cc): Cf |bgcolor(#ff99cc): Es |bgcolor(#ff99cc): Fm |bgcolor(#ff99cc): Md |bgcolor(#ff99cc): No |\n\n*Chemical Series of the Periodic Table\n**@@bgcolor(#ff6666): Alkali metals@@\n**@@bgcolor(#ffdead): Alkaline earth metals@@\n**@@bgcolor(#ffbfff): Lanthanides@@\n**@@bgcolor(#ff99cc): Actinides@@\n**@@bgcolor(#ffc0c0): Transition metals@@\n**@@bgcolor(#cccccc): Poor metals@@\n**@@bgcolor(#cccc99): Metalloids@@\n**@@bgcolor(#a0ffa0): Nonmetals@@\n**@@bgcolor(#ffff99): Halogens@@\n**@@bgcolor(#c0ffff): Noble gases@@\n\n*State at standard temperature and pressure\n**those in @@color(red):red@@ are gases\n**those in @@color(green):green@@ are liquids\n**those in black are solids\n
/***\n|''Name:''|Select macro|\n|''Description:''|To make it easy to edit tiddler relationships|\n|''Version:''|0.1|\n|''Date:''|Aug 1, 2006|\n|''Source:''|http://www.tiddlystyles.com|\n|''Author:''|ClintChecketts (checketts (at) gmail (dot) com)|\n|''License:''|[[BSD open source license]]|\n|''~CoreVersion:''|2.1.0|\n|''Browser:''|Firefox 1.0.4+; Firefox 1.5; InternetExplorer 6.0|\n\n!Updates\n* added a couple of bits - Simon\n\n***/\n\n//{{{\nversion.extensions.select = {major: 0, minor: 0, revision: 1, date: new Date(2006,8,1)};\nconfig.macros.select = {tooltip: "Show tiddlers tagged with '%0'",noTags: "There are no tags to display"};\n\nconfig.macros.select.handler = function(place,macroName,params,wikifier,paramString,tiddler)\n{\n authors = [];\n\n var selectFrom = params[1].readBracketedList();\n\n for(var i=0; i<selectFrom.length; i++)\n authors.push({name:selectFrom[i], caption:selectFrom[i]});\n\n var selector = createTiddlyDropDown(place,null,authors,store.getValue(tiddler.title,params[0]));\n selector.setAttribute("edit",params[0]);\n}\n\n// //Extending this for fun\n\nfunction createTiddlyDropDown(place,onchange,options,defaultValue)\n{\n var sel = createTiddlyElement(place,"select");\n sel.onchange = onchange;\n var foo = 0;\n for(var t=0; t<options.length; t++)\n {\n var e = createTiddlyElement(sel,"option",null,null,options[t].caption);\n if (options[t].name == defaultValue) foo = t;\n e.value = options[t].name;\n }\n sel.selectedIndex = foo;\n return sel;\n}\n\n//}}}
/***\nQuick and dirtly palette switcher for 2.1.x\n<<selectPalette>>\nWARNING this will overwrite your ColorPalette tiddler.\n***/\n\n//{{{\n\nmerge(config.macros,{\n\n setPalette: {\n\n handler: function(place,macroName,params,wikifier,paramString,tiddler) {\n var paletteName = params[0] ? params[0] : tiddler.title;\n createTiddlyButton(place,"apply","Apply this palette",function(e) {\n config.macros.selectPalette.updatePalette(tiddler.title);\n return false;\n });\n }\n },\n\n selectPalette: {\n\n handler: function(place,macroName,params,wikifier,paramString,tiddler) {\n createTiddlyDropDown(place,this.onPaletteChange,this.getPalettes());\n },\n\n getPalettes: function() {\n var result = [\n {caption:"-select palette-", name:""},\n {caption:"(Default)", name:"(default)"}\n ];\n var tagged = store.getTaggedTiddlers("palette","title");\n for(var t=0; t<tagged.length; t++)\n result.push({caption:tagged[t].title, name:tagged[t].title});\n return result;\n },\n\n onPaletteChange: function(e) {\n config.macros.selectPalette.updatePalette(this.value);\n return true;\n },\n\n updatePalette: function(title) {\n if (title != "") {\n store.deleteTiddler("ColorPalette");\n if (title != "(default)")\n store.saveTiddler("ColorPalette","ColorPalette",store.getTiddlerText(title),\n config.options.txtUserName,undefined,"");\n this.refreshPalette();\n if(config.options.chkAutoSave)\n saveChanges(true);\n }\n },\n\n refreshPalette: function() {\n config.macros.refreshDisplay.onClick();\n }\n }\n});\n\n//}}}\n
//{{{\n\nmerge(config.macros,{\n showEvents: {\n handler: function(place,macroName,params,wikifier,paramString,tiddler) {\n\n var events = store.getTaggedTiddlers("Event");\n\n var sortEvents = [];\n\n for (var i=0;i<events.length;i++) {\n var event = events[i];\n var startDate = this.getEventDate(event);\n sortEvents.push([\n startDate,\n startDate.formatString("hh12:0mm am"),\n this.getEventDuration(event,startDate).formatString("hh12:0mm am"),\n event.title,\n store.getValue(event,'event.location'),\n event.text.substr(0,50).replace(/\sr\sn/g," ").replace(/\sn/g," ")\n ]);\n }\n\n sortEvents.sort(function(a,b) {return a[1] < b[1] ? -1 : (a[1] == b[1] ? 0 : +1);});\n\n var output = "";\n var currentDay = "";\n var prevDay = "x";\n\n for (var j=0;j<sortEvents.length;j++) {\n\n currentDay = sortEvents[j][0].formatString("DDD, DD-mmm-YY");\n\n if (currentDay != prevDay)\n output += "!!" + currentDay + "\sn";\n\n output += "* %1 - %2, [[%3]], %4, %5 [[...|%3]]\sn".format(sortEvents[j]);\n\n prevDay = currentDay;\n }\n\n wikify(output,place,null,tiddler);\n },\n\n getEventDate: function(tiddler) {\n var year = parseInt(store.getValue(tiddler,'event.start.year'));\n var month = config.messages.dates.shortMonths.indexOf(store.getValue(tiddler,'event.start.month'));\n var day = parseInt(store.getValue(tiddler,'event.start.day'));\n var hour = parseInt(store.getValue(tiddler,'event.start.hour'));\n var minute = parseInt(store.getValue(tiddler,'event.start.minute'));\n var ampm = parseInt(store.getValue(tiddler,'event.start.ampm'));\n\n if (ampm == 'pm')\n hour += 12;\n else if (hour == 12)\n hour = 0;\n\n return new Date(year,month,day,hour,minute);\n },\n\n getEventDuration: function(tiddler,start) {\n var hour = parseInt(store.getValue(tiddler,'event.duration.hour'));\n var minute = parseInt(store.getValue(tiddler,'event.duration.minute'));\n return new Date(start.valueOf() + 1000 * 60 * ( minute + 60 * hour ));\n }\n\n\n }\n});\n\n//}}}\n\n
merge(config.macros,{\n showPalette: {\n handler: function(place,macroName,params,wikifier,paramString,tiddler) {\n var title = params[0] ? params[0] : tiddler.title; \n var colors = store.calcAllSlices(title);\n var output = '';\n var prefix;\n var lastPrefix;\n for (var c in colors) {\n prefix = c.substr(0,4);\n if (lastPrefix != prefix && lastPrefix && prefix != 'Fore')\n output += '<br clear="both"/>';\n output += '<div style="background:'+colors[c]+'"><span>'+c+'</span></div>';\n lastPrefix = prefix;\n }\n wikify('<html><div class="showPalette">'+output+'</div></html>',place);\n }\n }\n});\n\nsetStylesheet(''+\n '.showPalette div { text-align:right; vertical-align:top; float:left; padding:2px; width:140px; height:80px; }\sn'+\n '.showPalette div span { padding:0 0.5em;background:white; border:1px solid black; font-size:80%; }\sn'+\n '',"showPaletteStyles");\n\n
<<search>><<closeAll>><<permaview>><<newTiddler>><<newJournal 'DD MMM YYYY'>><<newTiddler tag:Event label:'new event' title:'New Event' text:'Event details'>><<newTiddler tag:Task tag:Next tag:'My Project' label:'new task' title:'New Task' text:'Enter task details'>><<saveChanges>><<upload http://mptw-beta.tiddlyspot.com/store.cgi index.html . . mptw-beta>><<slider chkSliderOptionsPanel OptionsPanel 'options ยป' 'Change TiddlyWiki advanced options'>>
Demo the new site map feature of TagglyTaggingPlugin
<<version>>
~MonkeyPirateTiddlyWiki Experimental
Background: #fff\nForeground: #000\nPrimaryPale: #8cf\nPrimaryLight: #18f\nPrimaryMid: #04b\nPrimaryDark: #014\nSecondaryPale: #ffc\nSecondaryLight: #fe8\nSecondaryMid: #db4\nSecondaryDark: #841\nTertiaryPale: #eee\nTertiaryLight: #ccc\nTertiaryMid: #999\nTertiaryDark: #666\nError: #f88\n
!By Dave Gifford\n\nBackground: #FFBCAD\nForeground: #000\nPrimaryPale: #F67276\nPrimaryLight: #FF6633\nPrimaryMid: #A73853\nPrimaryDark: #000\nSecondaryPale: #ffc\nSecondaryLight: #fe8\nSecondaryMid: #db4\nSecondaryDark: #841\nTertiaryPale: #FFBCAD\nTertiaryLight: #EEC591\nTertiaryMid: #000\nTertiaryDark: #8B7355
[[MonkeyPirateStyles]]\n\n/*{{{*/\n.tagglyTagged li.listTitle { display:none;}\n.tagglyTagged li { display: inline; font-size:90%; }\n.tagglyTagged ul { margin:0px; padding:0px; }\n.tagglyTagging { padding-top:0.5em; }\n.tagglyTagging li.listTitle { display:none; }\n.tagglyTagging ul {\n margin-top:0px; padding-top:0.5em; padding-left:2em;\n margin-bottom:0px; padding-bottom:0px;\n}\n.tagglyTagging { vertical-align: top; margin:0px; padding:0px; }\n.tagglyTagging table { margin:0px; padding:0px; }\n.tagglyTagging .button { display:none; margin-left:3px; margin-right:3px; }\n.tagglyTagging .button, .tagglyTagging .hidebutton {\n color:[[ColorPalette::TertiaryLight]]; font-size:90%;\n border:0px; padding-left:0.3em;padding-right:0.3em;\n}\n.tagglyTagging .button:hover, .hidebutton:hover {\n background:[[ColorPalette::TertiaryPale]]; color:[[ColorPalette::TertiaryDark]];\n}\n.selected .tagglyTagging .button {\n display:inline;\n}\n.tagglyTagging .hidebutton { color:[[ColorPalette::Background]]; }\n.selected .tagglyTagging .hidebutton { color:[[ColorPalette::TertiaryLight]] }\n.tagglyLabel { color:[[ColorPalette::TertiaryMid]]; font-size:90%; }\n.tagglyTagging ul {padding-top:0px; padding-bottom:0.5em; margin-left:1em; }\n.tagglyTagging ul ul {list-style-type:disc; margin-left:-1em;}\n.tagglyTagging ul ul li {margin-left:0.5em; }\n.editLabel { font-size:90%; padding-top:0.5em; }\n.tagglyTagging .commas { padding-left:1.8em; }\n\n\n.tagglyTagged .quickopentag, .tagged .quickopentag \n { margin-right:1.2em; border:1px solid #eee; padding:2px; padding-right:0px; padding-left:1px; }\n.quickopentag .tiddlyLink { padding:2px; padding-left:3px; }\n.quickopentag a.button { padding:1px; padding-left:2px; padding-right:2px;}\n#displayArea .viewer .quickopentag a.button, \n#displayArea .viewer .quickopentag a.tiddyLink, \n#mainMenu .quickopentag a.tiddyLink, \n#mainMenu .quickopentag a.tiddyLink \n { border:0px solid black; }\n#displayArea .viewer .quickopentag a.button, \n#mainMenu .quickopentag a.button \n { margin-left:0px; padding-left:2px; }\n#displayArea .viewer .quickopentag a.tiddlyLink, \n#mainMenu .quickopentag a.tiddlyLink \n { margin-right:0px; padding-right:0px; padding-left:0px; margin-left:0px; }\na.miniTag {font-size:150%;} \n#mainMenu .quickopentag a.button \n{ margin-left:0px; padding-left:2px; margin-right:0px; padding-right:0px; }\n/*}}}*/\n
/***\n| Name:|TagglyTaggingPlugin|\n| Description:|tagglyTagging macro is a replacement for the builtin tagging macro in your ViewTemplate|\n| Version:|2.0.0|\n| Date:|21-Sep-2006|\n| Source:|http://mptw.tiddlyspot.com/#TagglyTaggingPlugin|\n| Author:|Simon Baird <simon.baird@gmail.com>|\n| CoreVersion:|2.1.x|\n!Notes\nSee http://mptw.tiddlyspot.com/#TagglyTagging\n***/\n//{{{\n\nconfig.taggly = {\n\n // for translations\n lingo: {\n labels: {\n asc: "\su2191", // down arrow\n desc: "\su2193", // up arrow\n title: "title",\n modified: "modified",\n created: "created",\n show: "+",\n hide: "-",\n normal: "normal",\n group: "group",\n commas: "commas",\n sitemap: "sitemap",\n numCols: "cols\su00b1", // plus minus sign\n label: "Tagged as %0:"\n },\n\n tooltips: {\n title: "Click to sort by title",\n modified: "Click to sort by modified date",\n created: "Click to sort by created date",\n show: "Click to show tagging list",\n hide: "Click to hide tagging list",\n normal: "Click to show a normal ungrouped list",\n group: "Click to show list grouped by tag",\n sitemap: "Click to show a sitemap style list",\n commas: "Click to show a comma separated list",\n numCols: "Click to change number of columns"\n }\n },\n\n config: {\n showTaggingCounts: true,\n listOpts: {\n // the first one will be the default\n sortBy: ["title","modified","created"],\n sortOrder: ["asc","desc"],\n hideState: ["show","hide"],\n listMode: ["normal","group","sitemap","commas"],\n numCols: ["1","2","3","4","5","6"]\n },\n valuePrefix: "taggly."\n },\n\n getTagglyOpt: function(title,opt) {\n var val = store.getValue(title,this.config.valuePrefix+opt);\n return val ? val : this.config.listOpts[opt][0];\n },\n\n setTagglyOpt: function(title,opt,value) {\n if (!store.tiddlerExists(title))\n // create it silently\n store.saveTiddler(title,title,config.views.editor.defaultText.format([title]),config.options.txtUserName,new Date(),null);\n // if value is default then remove it to save space\n return store.setValue(title,\n this.config.valuePrefix+opt,\n value == this.config.listOpts[opt][0] ? null : value);\n },\n\n getNextValue: function(title,opt) {\n var current = this.getTagglyOpt(title,opt);\n var pos = this.config.listOpts[opt].indexOf(current);\n // a little usability enhancement. actually it doesn't work right for grouped or sitemap\n var limit = (opt == "numCols" ? store.getTaggedTiddlers(title).length : this.config.listOpts[opt].length);\n var newPos = (pos + 1) % limit;\n return this.config.listOpts[opt][newPos];\n },\n\n toggleTagglyOpt: function(title,opt) {\n var newVal = this.getNextValue(title,opt);\n this.setTagglyOpt(title,opt,newVal);\n },\n\n createListControl: function(place,title,type) {\n var lingo = config.taggly.lingo;\n var label;\n var tooltip;\n var onclick;\n\n if ((type == "title" || type == "modified" || type == "created")) {\n // "special" controls. a little tricky. derived from sortOrder and sortBy\n label = lingo.labels[type];\n tooltip = lingo.tooltips[type];\n\n if (this.getTagglyOpt(title,"sortBy") == type) {\n label += lingo.labels[this.getTagglyOpt(title,"sortOrder")];\n onclick = function() {\n config.taggly.toggleTagglyOpt(title,"sortOrder");\n return false;\n }\n }\n else {\n onclick = function() {\n config.taggly.setTagglyOpt(title,"sortBy",type);\n config.taggly.setTagglyOpt(title,"sortOrder",config.taggly.config.listOpts.sortOrder[0]);\n return false;\n }\n }\n }\n else {\n // "regular" controls, nice and simple\n label = lingo.labels[type == "numCols" ? type : this.getNextValue(title,type)];\n tooltip = lingo.tooltips[type == "numCols" ? type : this.getNextValue(title,type)];\n onclick = function() {\n config.taggly.toggleTagglyOpt(title,type);\n return false;\n }\n }\n\n // hide button because commas don't have columns\n if (!(this.getTagglyOpt(title,"listMode") == "commas" && type == "numCols"))\n createTiddlyButton(place,label,tooltip,onclick,type == "hideState" ? "hidebutton" : "button");\n },\n\n makeColumns: function(orig,numCols) {\n var listSize = orig.length;\n var colSize = listSize/numCols;\n var remainder = listSize % numCols;\n\n var upperColsize = colSize;\n var lowerColsize = colSize;\n\n if (colSize != Math.floor(colSize)) {\n // it's not an exact fit so..\n upperColsize = Math.floor(colSize) + 1;\n lowerColsize = Math.floor(colSize);\n }\n\n var output = [];\n var c = 0;\n for (var j=0;j<numCols;j++) {\n var singleCol = [];\n var thisSize = j < remainder ? upperColsize : lowerColsize;\n for (var i=0;i<thisSize;i++) \n singleCol.push(orig[c++]);\n output.push(singleCol);\n }\n\n return output;\n },\n\n drawTable: function(place,columns,theClass) {\n var newTable = createTiddlyElement(place,"table",null,theClass);\n var newTbody = createTiddlyElement(newTable,"tbody");\n var newTr = createTiddlyElement(newTbody,"tr");\n for (var j=0;j<columns.length;j++) {\n var colOutput = "";\n for (var i=0;i<columns[j].length;i++) \n colOutput += columns[j][i];\n var newTd = createTiddlyElement(newTr,"td",null,"tagglyTagging"); // todo should not need this class\n wikify(colOutput,newTd);\n }\n return newTable;\n },\n\n // a normal basic taggly list (but made more complicated by the column feature)\n createTagglyList: function(place,title) {\n switch(this.getTagglyOpt(title,"listMode")) {\n case "group": return this.createTagglyListGrouped(place,title); break;\n case "normal": return this.createTagglyListNormal(place,title,false); break;\n case "commas": return this.createTagglyListNormal(place,title,true); break;\n case "sitemap":return this.createTagglyListSiteMap(place,title); break;\n }\n },\n\n getTaggingCount: function(title) {\n // thanks to Doug Edmunds\n var output = "";\n if (this.config.showTaggingCounts) {\n var tagCount = store.getTaggedTiddlers(title).length;\n if (tagCount > 0)\n output = " ("+tagCount+")";\n }\n return output;\n },\n\n // this is for normal and commas mode\n createTagglyListNormal: function(place,title,useCommas) {\n\n var list = store.getTaggedTiddlers(title,this.getTagglyOpt(title,"sortBy"));\n\n if (this.getTagglyOpt(title,"sortOrder") == "desc")\n list = list.reverse();\n\n var output = [];\n for (var i=0;i<list.length;i++) {\n var countString = this.getTaggingCount(list[i].title);\n if (useCommas)\n output.push((i > 0 ? ", " : "") + "[[" + list[i].title + "]]" + countString);\n else\n output.push("*[[" + list[i].title + "]]" + countString + "\sn");\n }\n\n return this.drawTable(place,\n this.makeColumns(output,useCommas ? 1 : parseInt(this.getTagglyOpt(title,"numCols"))),\n useCommas ? "commas" : "normal");\n },\n\n // this is for the "grouped" mode\n createTagglyListGrouped: function(place,title) {\n var sortBy = this.getTagglyOpt(title,"sortBy");\n var sortOrder = this.getTagglyOpt(title,"sortOrder");\n\n var list = store.getTaggedTiddlers(title,sortBy);\n\n if (sortOrder == "desc")\n list = list.reverse();\n\n var leftOvers = []\n for (var i=0;i<list.length;i++)\n leftOvers.push(list[i].title);\n\n var allTagsHolder = {};\n for (var i=0;i<list.length;i++) {\n for (var j=0;j<list[i].tags.length;j++) {\n\n if (list[i].tags[j] != title) { // not this tiddler\n\n if (!allTagsHolder[list[i].tags[j]])\n allTagsHolder[list[i].tags[j]] = "";\n\n allTagsHolder[list[i].tags[j]] += "**[["+list[i].title+"]]"\n + this.getTaggingCount(list[i].title) + "\sn";\n leftOvers.setItem(list[i].title,-1); // remove from leftovers. at the end it will contain the leftovers\n }\n }\n }\n\n var allTags = [];\n for (var t in allTagsHolder)\n allTags.push(t);\n\n var sortHelper = function(a,b) {\n if (a == b) return 0;\n if (a < b) return -1;\n return 1;\n };\n\n allTags.sort(function(a,b) {\n var tidA = store.getTiddler(a);\n var tidB = store.getTiddler(b);\n if (sortBy == "title") return sortHelper(a,b);\n else if (!tidA && !tidB) return 0;\n else if (!tidA) return -1;\n else if (!tidB) return +1;\n else return sortHelper(tidA[sortBy],tidB[sortBy]);\n });\n\n var leftOverOutput = "";\n for (var i=0;i<leftOvers.length;i++)\n leftOverOutput += "*[["+leftOvers[i]+"]]" + this.getTaggingCount(leftOvers[i]) + "\sn";\n\n var output = [];\n\n if (sortOrder == "desc")\n allTags.reverse();\n else if (leftOverOutput != "")\n // leftovers first...\n output.push(leftOverOutput);\n\n for (var i=0;i<allTags.length;i++)\n output.push("*[["+allTags[i]+"]]" + this.getTaggingCount(leftOvers[i]) + "\sn" + allTagsHolder[allTags[i]]);\n\n if (sortOrder == "desc" && leftOverOutput != "")\n // leftovers last...\n output.push(leftOverOutput);\n\n return this.drawTable(place,\n this.makeColumns(output,parseInt(this.getTagglyOpt(title,"numCols"))),\n "grouped");\n\n },\n\n // used by SiteMap macro\n treeTraverse: function(title,depth,sortBy,sortOrder) {\n\n var list = store.getTaggedTiddlers(title,sortBy);\n if (sortOrder == "desc")\n list.reverse();\n\n var indent = "";\n for (var j=0;j<depth;j++)\n indent += "*"\n\n var childOutput = "";\n for (var i=0;i<list.length;i++)\n if (list[i].title != title)\n childOutput += this.treeTraverse(list[i].title,depth+1,sortBy,sortOrder);\n\n if (depth == 0)\n return childOutput;\n else\n return indent + "[["+title+"]]" + this.getTaggingCount(title) + "\sn"+childOutput;\n },\n\n createTagglyListSiteMap: function(place,title) {\n var output = this.treeTraverse(title,0,this.getTagglyOpt(title,"sortBy"),this.getTagglyOpt(title,"sortOrder"));\n return this.drawTable(place,\n this.makeColumns(output.split(/(?=^\s*\s[)/m),parseInt(this.getTagglyOpt(title,"numCols"))), // regexp magic\n "sitemap"\n );\n },\n\n macros: {\n tagglyTagging: {\n handler: function (place,macroName,params,wikifier,paramString,tiddler) {\n var title = tiddler.title;\n if (store.getTaggedTiddlers(title).length > 0) {\n var lingo = config.taggly.lingo;\n config.taggly.createListControl(place,title,"hideState");\n if (config.taggly.getTagglyOpt(title,"hideState") == "show") {\n createTiddlyElement(place,"span",null,"tagglyLabel",lingo.labels.label.format([title]));\n config.taggly.createListControl(place,title,"title");\n config.taggly.createListControl(place,title,"modified");\n config.taggly.createListControl(place,title,"created");\n config.taggly.createListControl(place,title,"listMode");\n config.taggly.createListControl(place,title,"numCols");\n // do some refresh magic to make it keep the list fresh - thanks Saq\n var refreshContainer = createTiddlyElement(place,"div");\n refreshContainer.setAttribute("refresh","macro");\n refreshContainer.setAttribute("macroName",macroName);\n refreshContainer.setAttribute("title",tiddler.title);\n this.refresh(refreshContainer);\n }\n }\n },\n refresh: function(place) {\n removeChildren(place);\n config.taggly.createTagglyList(place,place.getAttribute("title"));\n }\n }\n },\n\n // todo fix these up a bit\n styles: \n"/*{{{*/"+\n".tagglyTagged li.listTitle { display:none;}"+\n".tagglyTagged li { display: inline; font-size:90%; }"+\n".tagglyTagged ul { margin:0px; padding:0px; }"+\n".tagglyTagging { padding-top:0.5em; }"+\n".tagglyTagging li.listTitle { display:none; }"+\n".tagglyTagging ul {"+\n" margin-top:0px; padding-top:0.5em; padding-left:2em;"+\n" margin-bottom:0px; padding-bottom:0px;"+\n"}"+\n".tagglyTagging { vertical-align: top; margin:0px; padding:0px; }"+\n".tagglyTagging table { margin:0px; padding:0px; }"+\n".tagglyTagging .button { display:none; margin-left:3px; margin-right:3px; }"+\n".tagglyTagging .button, .tagglyTagging .hidebutton {"+\n" color:[[ColorPalette::TertiaryLight]]; font-size:90%;"+\n" border:0px; padding-left:0.3em;padding-right:0.3em;"+\n"}"+\n".tagglyTagging .button:hover, .hidebutton:hover {"+\n" background:[[ColorPalette::TertiaryPale]]; color:[[ColorPalette::TertiaryDark]];"+\n"}"+\n".selected .tagglyTagging .button {"+\n" display:inline;"+\n"}"+\n".tagglyTagging .hidebutton { color:[[ColorPalette::Background]]; }"+\n".selected .tagglyTagging .hidebutton { color:[[ColorPalette::TertiaryLight]] }"+\n".tagglyLabel { color:[[ColorPalette::TertiaryMid]]; font-size:90%; }"+\n".tagglyTagging ul {padding-top:0px; padding-bottom:0.5em; margin-left:1em; }"+\n".tagglyTagging ul ul {list-style-type:disc; margin-left:-1em;}"+\n".tagglyTagging ul ul li {margin-left:0.5em; }"+\n".editLabel { font-size:90%; padding-top:0.5em; }"+\n".tagglyTagging .commas { padding-left:1.8em; }"+\n"/*}}}*/"+\n "",\n\n init: function() {\n merge(config.macros,this.macros);\n config.shadowTiddlers.mptwTagglyStyles = this.styles;\n config.notifyTiddlers.push({name:"mptwTagglyStyles", notify: refreshStyles});\n }\n};\n\nconfig.taggly.init();\n\n//}}}\n\n
<div style="font-size:120%;font-weight:bold;border-top:1px solid #aaa; border-bottom:1px solid #aaa;padding:0.25em;">\n <span style="padding-left:1em;" macro="toggleTag Done"></span>\n <span style="padding-left:1em;" macro="toggleTag Next"></span>\n</div>
$1
Type the text for 'New Tiddler' [[gpp]]
{{{\n<<tiddler KnockKnock with:"Lucy" with:"Lucy lastic means your pants fall down">>\n<<tiddler KnockKnock with:"Jess" with:"It's Jess me, open the door">>\n}}}\n<<tiddler KnockKnock with:"Lucy" with:"Lucy lastic means your pants fall down">>\n<<tiddler KnockKnock with:"Jess" with:"It's Jess me, open the door">>\n----\n{{{\n|a|<<tiddler Test2 with:{{2+3}}>>|b|\n}}}\n|a|<<tiddler Test2 with:{{2+3}}>>|b|\n----\n{{{\n<<eval 2+5 >>\n<<eval tiddler.title >>\n}}}\n<<eval 2+5 >>\n<<eval tiddler.title >>\n(See EvalMacro)\n----\nDoesn't work \n{{{\n<<newTiddler tag:{{tiddler.title}} label:'new here'>>\n}}}\n<<newTiddler tag:{{tiddler.title}} label:'new here'>>\n
/***\nSee http://lewcid.googlepages.com/beta.html\n***/\n//{{{\n//return the value of a field as an array. (fieldValue is in bracketed list format)\nTiddlyWiki.prototype.getValueAsArray = function (tiddler,fieldName)\n{\n return store.getValue(tiddler,fieldName).readBracketedList();\n}\n\n//set the value of a field from an array, as a bracketed list\nTiddlyWiki.prototype.setValueAsArray = function (tiddler,fieldName,value)\n{\n store.setValue(tiddler,fieldName,String.encodeTiddlyLinkList(value));\n}\n//}}}\n\n\n//{{{\n// Returns an array of all tiddlers with a given field, along with the field value.\n// Each member of the array is another array where [0] is the tiddler and [1] is the value of the field\nTiddlyWiki.prototype.getTiddlersAndFieldValues = function (field)\n{\n var results= [];\n this.forEachTiddler(function(title,tiddler){\n var fieldResult = store.getValue(tiddler,field);\n if (fieldResult!=undefined)\n results.push([tiddler,fieldResult]);\n });\n results.sort(function(a,b) {return a[0]["title"] < b[0]["title"] ? -1 : (a[0]["title"] == b[0]["title"] ? 0 : +1);});\n return results;\n}\n//}}}\n\n\n//{{{\n//returns a sorted array of tiddlers that do not have a given field\nTiddlyWiki.prototype.getTiddlersWithoutField = function (field)\n{\n var results= [];\n this.forEachTiddler(function(title,tiddler){\n if (store.getValue(tiddler,field)==undefined)\n {results.push(tiddler);}\n });\n results.sort();\n return results;\n}\n//}}}\n\n//{{{\n//returns a sorted array of tiddlers with a given field\n// if fieldValue is specified, returns array of tiddlers that have given field with value equal to fieldValue\n//if resultMatch is false, returns array of tiddlers that have given field with value NOT equal to fieldValue\nTiddlyWiki.prototype.getTiddlersWithField = function (field,fieldValue,resultMatch)\n{ \n if (resultMatch==undefined) var resultMatch = true;\n var results= [];\n this.forEachTiddler(function(title,tiddler){\n var f = !resultMatch;\n var fieldResult = store.getValue(tiddler,field);\n if (fieldResult!=undefined)\n {if(fieldValue == undefined || fieldValue == fieldResult)\n {f= resultMatch;}\n if (f) results.push(tiddler); }\n\n });\n results.sort(function(a,b) {return a["title"] < b["title"] ? -1 : (a["title"] == b["title"] ? 0 : +1);});\n return results;\n}\n//}}}\n\n//{{{\n//utility function for getFieldValues\nwindow.selectivePush=selectivePush;\nfunction selectivePush (fieldValue,results)\n{\n var f = false;\n for(var c=0; c<results.length; c++)\n if(results[c][0] == fieldValue)\n {\n f = true;\n results[c][1]++;\n }\n if(!f)\n results.push([fieldValue,1]);\n return results;\n}\n\n//internal function, use getFieldStringValues and getFieldArrayValues\n//returns all values of a given field that exist in the TW in an array\n//Each member of the array is another array where [0] is the value and [1] is number of occurances of the value\n//mode: whether to treat the field as a string, or an array written in a bracketed list\nwindow.getFieldValues = getFieldValues;\nfunction getFieldValues (fieldName,mode)\n{\n var results = [];\n var tiddlers = store.getTiddlersAndFieldValues(fieldName);\n for (var i=0; i<tiddlers.length; i++)\n {\n if (mode == "array")\n {\n var values = tiddlers[i][1].readBracketedList();;\n for (var j=0; j<values.length; j++)\n {\n var fieldValue = values[j];\n results = selectivePush(fieldValue,results);\n }\n }\n else if (mode == "string")\n {\n var fieldValue = tiddlers[i][1];\n results = selectivePush(fieldValue,results);\n }\n }\n return results.sort(function(a,b) {return a[0].toLowerCase() < b[0].toLowerCase() ? -1 : (a[0].toLowerCase() == b[0].toLowerCase() ? 0 : +1);});\n}\n\n//returns all values of a given field that exist in the TW in an array\n//the fieldValue is treated as a string\n//Each member of the array is another array where [0] is the value and [1] is number of occurances of the value\nwindow.getFieldStringValues = getFieldStringValues;\nfunction getFieldStringValues(fieldName)\n{\n return getFieldValues(fieldName,"string");\n}\n\n//returns all values of a given field that exist in the TW in an array\n//the fieldValue is treated as an array written as a bracketedList\n//Each member of the array is another array where [0] is the value and [1] is number of occurances of the value\nwindow.getFieldArrayValues = getFieldArrayValues;\nfunction getFieldArrayValues(fieldName)\n{\n return getFieldValues(fieldName,"array");\n}\n//}}}\n\n//{{{\n// Adds a specified value to the edit field for a particular tiddler, treating the field value as an array.\n// string option will be available soon\n// title - name of tiddler\n// tag - value to set, without any [[brackets]]\n// add: +1 to add the tag, -1 to remove it, 0 to toggle it\n//field: the edit attribute of the target field\nStory.prototype.setTiddlerField = function(title,tag,add,field)\n{\n var c = story.getTiddlerField(title,field);\n\n var tags = c.value.readBracketedList();\n var p = tags.find(tag);\n if(add == 0)\n add = (p == null) ? +1 : -1;\n if(add == +1)\n {\n if(p == null)\n tags.push(tag);\n }\n else if(add == -1)\n {\n if(p != null)\n tags.splice(p,1);\n }\n c.value = String.encodeTiddlyLinkList(tags);\n}\n\nStory.prototype.setTiddlerTag = function(title,tag,add)\n{\n Story.prototype.setTiddlerField(title,tag,add,"tags");\n}\n//}}}
TiddlerSlicing allows you to use special notation to pull out a chunk of specially marked text from within a tiddler. Each slice has a name and a value which can be specified anywhere within a tiddler in any of these formats:\n{{{\n theName: textSlice\n |theName:| textSlice |\n |theName| textSlice |\n}}}\nThe name may contain any of the characters "a-ZA-Z_0-9", and may also be decorated with {{{''}}} or {{{//}}} markers for ''bold'' and //italic// formatting that are ignored. For example:\n{{{\n |''theName:''| textSlice |\n}}}\nSlices can be then be referenced by qualifying the parent tiddler name with the symbols "::" and the name of the slice. For example:\n{{{\nColorPalette::PrimaryLight\n}}}\nTiddlerSlicing doesn't work eveywhere; at this point it is mainly intended to support the ColorPalette and similar usages.\n\nFinally, here's an example of some more complex slice formatting:\n{{{\nversion: 1.2.3.4\nAuthor: Joe Brown\n''Credits:'' ASmith BBrown CCalony\n//~SeeAlso:// The rise and fall of the M-perium\n|!Name|!Value|\n|Name:|TextSlice Tester|\n|URL:|http:\s\ssample.com\sTestSliced |\n|''Type:''| Plugin |\n|//Source//| http:\s\ssample.com\sTestSliced\ssrc\stext.js |\n}}}\nThe slices defined in that example are:\n|version|1.2.3.4|\n|Author|Joe Brown|\n|Credits|ASmith BBrown CCalony|\n|~SeeAlso|The rise and fall of the M-perium|\n|Name|TextSlice Tester|\n|URL|http:\s\ssample.com\sTestSliced|\n|Type|Plugin|\n|Source|http:\s\ssample.com\sTestSliced\ssrc\stext.js|\n
|''URL:''|http://www.tiddlytools.com/|
|''URL:''|http://www.tiddlywiki.com/|\n\nThe current, non-Beta version of TiddlyWiki is at http://www.tiddlywiki.com
See http://www.tiddlywiki.com/firstversion.html\n{{{\nTiddlyWiki 1.0 by Jeremy Ruston, (jeremy [at] osmosoft [dot] com)\nCopyright (c) Osmosoft Limited, 20 September 2004\nAll rights reserved.\n}}}\n
/***\n| ''Name:''|ToggleTagMacro|\n| ''Description:''|Makes a checkbox which toggles a tag in a tiddler|\n| ''Version:''|2.0.1|\n| ''Date:''|Jul 31, 2006|\n| ''Source:''|http://tiddlyspot.com/mptw/#ToggleTagMacro|\n| ''Author:''|SimonBaird|\n| ''License:''|[[BSD open source license]]|\n| ''~CoreVersion:''|2.1|\n!Usage\n{{{<<toggleTag }}}//{{{TagName TiddlerName LabelText}}}//{{{>>}}}\n* TagName - the tag to be toggled, default value "checked"\n* TiddlerName - the tiddler to toggle the tag in, default value the current tiddler\n* LabelText - the text (gets wikified) to put next to the check box, default value is '{{{[[TagName]]}}}' or '{{{[[TagName]] [[TiddlerName]]}}}'\n(If a parameter is '.' then the default will be used)\n\nExamples:\n\n|Code|Description|Example|h\n|{{{<<toggleTag>>}}}|Toggles the default tag (checked) in this tiddler|<<toggleTag>>|\n|{{{<<toggleTag TagName>>}}}|Toggles the TagName tag in this tiddler|<<toggleTag TagName>>|\n|{{{<<toggleTag TagName TiddlerName>>}}}|Toggles the TagName tag in the TiddlerName tiddler|<<toggleTag TagName TiddlerName>>|\n|{{{<<toggleTag TagName TiddlerName 'click me'>>}}}|Same but with custom label|<<toggleTag TagName TiddlerName 'click me'>>|\n|{{{<<toggleTag . . 'click me'>>}}}|dot means use default value|<<toggleTag . . 'click me'>>|\n(Note if TiddlerName doesn't exist it will be silently created)\n\n!Known issues\n* Doesn't smoothly handle the case where you toggle a tag in a tiddler that is current open for editing. Should it stick the tag in the edit box?\n\n***/\n//{{{\n\nmerge(config.macros,{\n toggleTag: {\n doRefreshAll: true,\n createIfRequired: true,\n shortLabel: "[[%0]]",\n longLabel: "[[%0]] [[%1]]",\n handler: function(place,macroName,params,wikifier,paramString,tiddler) {\n var tag = (params[0] && params[0] != '.') ? params[0] : "checked";\n var title = (params[1] && params[1] != '.') ? params[1] : tiddler.title;\n var defaultLabel = (title == tiddler.title ? this.shortLabel : this.longLabel);\n var label = (params[2] && params[2] != '.') ? params[2] : defaultLabel;\n var theTiddler = title == tiddler.title ? tiddler : store.getTiddler(title);\n var cb = createTiddlyCheckbox(place, label.format([tag,title]), theTiddler && theTiddler.isTagged(tag), function(e) {\n if (!theTiddler) {\n if (config.macros.toggleTag.createIfRequired)\n store.saveTiddler(title,title,"",config.options.txtUserName,new Date(),null);\n else\n return false;\n }\n store.suspendNotifications(); // suggested by Saq to speed things up\n store.setTiddlerTag(title,this.checked,tag);\n store.resumeNotifications();\n if (config.macros.toggleTag.doRefreshAll)\n story.refreshAll();\n else\n store.refreshTiddler(title,DEFAULT_VIEW_TEMPLATE,true);\n return true;\n });\n }\n }\n});\n\nmerge(Story.prototype,{\n refreshAll: function() {\n this.forEachTiddler(function(title,element) {\n if (element.getAttribute("dirty") != "true") \n this.refreshTiddler(title,false,true);\n });\n }\n});\n\n\n//}}}\n
See UndoChangesPlugin and [[test]]. Try clicking the undo button in test. Or edit any tiddler here then click undo.
/***\n!UndoChangesPlugin\nLets you can undo the last change you just made to any tiddler. Use by adding undoChanges command to your toolbar in ViewTemplate.\n!!Notes\n* Experimental but works okay as far as I can tell.\n* Will double size of your store unless you purge sometimes.\n* Many thanks to Saq from http://lewcid.googlepages.com/lewcid.html for fixing up a few problems and making the rename tiddler undo work properly\n!!Ideas\n* I would like to hide the undo if there was no undo possible\n* Want to add a "revert" which means revert to what it is on disk\n* Probably should do a purge on save as default (configurable to not purge on save).\n* Maybe we need to purge undo data from an individual tiddler.\n<<purgeUndoData>>\n***/\n//{{{\n\nTiddlyWiki.prototype.saveTiddler_orig_undo = TiddlyWiki.prototype.saveTiddler;\n\nmerge(TiddlyWiki.prototype,{\n saveUndoData: function(tiddler,old) {\n store.setValue(tiddler,"undoText",old.text);\n store.setValue(tiddler,"undoTitle",old.title);\n store.setValue(tiddler,"undoTags",old.tags);\n\n },\n saveTiddler: function(title,newTitle,newBody,modifier,modified,tags,fields) {\n store.suspendNotifications();\n var before = merge({},this.fetchTiddler(title)); // makes clone\n var after = this.saveTiddler_orig_undo(title,newTitle,newBody,modifier,modified,tags,fields);\n this.saveUndoData(after,before);\n store.resumeNotifications();\n return after;\n }\n});\n\nmerge(config.commands,{\n undoChanges: {\n hideReadOnly: true,\n text: "undo",\n tootip: "Undo last change",\n handler: function(event,src,title) {\n var tiddler = store.fetchTiddler(title);\n if (store.getValue(tiddler,"undoText") == undefined)\n alert("No changes to undo.");\n else {\n var oldTitle = tiddler.title;\n var newTitle = store.getValue(tiddler,"undoTitle");\n var tiddlerDiv = document.getElementById(story.idPrefix + tiddler.title);\n tiddlerDiv.setAttribute("tiddler",newTitle);\n tiddlerDiv.id = story.idPrefix + newTitle;\n\n tiddler = store.saveTiddler(\n tiddler.title,\n newTitle,\n store.getValue(tiddler,"undoText"),\n config.options.txtUserName,\n new Date(), // TODO, support minor updates\n store.getValue(tiddler,"undoTags")\n );\n\n story.refreshTiddler(tiddler.title,null,true);\n if (oldTitle!=newTitle)\n store.notify(tiddler.title,true); //why does this slow things down so much?\n if (config.options.chkAutoSave)\n saveChanges();\n return false;\n }\n }\n }\n});\n\nmerge(config.macros,{\n purgeUndoData: {\n handler: function(place,macroName,params,wikifier,paramString,tiddler) {\n createTiddlyButton(place,"Purge Undo Data","Remove undo data from the store",\n function(e) {\n store.suspendNotifications();\n store.forEachTiddler(function(title,tiddler) {\n store.setValue(tiddler,"undoText");\n store.setValue(tiddler,"undoTags");\n store.setValue(tiddler,"undoTitle");\n });\n store.resumeNotifications();\n alert("Undo data purged for all tiddlers");\n });\n }\n }\n});\n\n//}}}\n
| !date | !user | !location | !storeUrl | !uploadDir | !toFilename | !backupdir | !origin |\n| 10/8/2006 12:12:15 | Simon | [[/|http://tiddlyspot.com/mptw-beta/#EvalMacro]] | [[store.cgi|http://tiddlyspot.com/mptw-beta/store.cgi]] | . | index.html | . |\n| 10/8/2006 12:16:19 | Simon | [[/|http://tiddlyspot.com/mptw-beta/#EvalMacro]] | [[store.cgi|http://tiddlyspot.com/mptw_beta/store.cgi]] | . | index.html | . | Ok |\n| 10/8/2006 12:17:7 | Simon | [[/|http://tiddlyspot.com/mptw_beta/#EvalMacro]] | [[store.cgi|http://tiddlyspot.com/mptw_beta/store.cgi]] | . | index.html | . |\n| 10/8/2006 13:19:35 | Simon | [[/|http://tiddlyspot.com/mptw_beta/#EvalMacro]] | [[store.cgi|http://tiddlyspot.com/mptw_beta/store.cgi]] | . | index.html | . |\n| 10/8/2006 14:14:16 | Simon | [[/|http://tiddlyspot.com/mptw_beta/]] | [[store.cgi|http://tiddlyspot.com/mptw_beta/store.cgi]] | . | index.html | . | Ok |\n| 10/8/2006 14:16:8 | Simon | [[/|http://tiddlyspot.com/mptw_beta/]] | [[store.cgi|http://tiddlyspot.com/mptw_beta/store.cgi]] | . | index.html | . |\n| 10/8/2006 14:24:36 | Simon | [[/|http://tiddlyspot.com/mptw_beta/]] | [[store.cgi|http://tiddlyspot.com/mptw_beta/store.cgi]] | . | index.html | . | Ok |\n| 10/8/2006 14:59:14 | Simon | [[/|http://tiddlyspot.com/mptw_beta/]] | [[store.cgi|http://tiddlyspot.com/mptw_beta/store.cgi]] | . | index.html | . |\n| 10/8/2006 15:14:11 | Simon | [[/|http://tiddlyspot.com/mptw_beta/]] | [[store.cgi|http://tiddlyspot.com/mptw_beta/store.cgi]] | . | index.html | . | Ok |\n| 10/8/2006 15:15:5 | Simon | [[/|http://tiddlyspot.com/mptw_beta/]] | [[store.cgi|http://tiddlyspot.com/mptw_beta/store.cgi]] | . | index.html | . | Ok |\n| 10/8/2006 15:42:14 | Simon | [[/|http://tiddlyspot.com/mptw_beta/]] | [[store.cgi|http://tiddlyspot.com/mptw_beta/store.cgi]] | . | index.html | . |\n| 10/8/2006 15:51:34 | Simon | [[/|http://tiddlyspot.com/mptw_beta/]] | [[store.cgi|http://tiddlyspot.com/mptw_beta/store.cgi]] | . | index.html | . | Ok |\n| 10/8/2006 15:53:1 | Simon | [[/|http://tiddlyspot.com/mptw_beta/]] | [[store.cgi|http://tiddlyspot.com/mptw_beta/store.cgi]] | . | index.html | . |\n| 10/8/2006 23:16:1 | YourName | [[mptw_beta.html|file:///D:/Documents%20and%20Settings/User/Desktop/mptw_beta.html]] | [[store.cgi|http://tiddlyspot.com/mptw_beta/store.cgi]] | . | index.html | . |\n| 10/8/2006 23:18:19 | YourName | [[mptw_beta.html|file:///D:/Documents%20and%20Settings/User/Desktop/mptw_beta.html]] | [[store.cgi|http://tiddlyspot.com/mptw_beta/store.cgi]] | . | index.html | . |\n| 11/8/2006 7:50:58 | YourName | [[/|http://tiddlyspot.com/mptw_beta/]] | [[store.cgi|http://tiddlyspot.com/mptw_beta/store.cgi]] | . | index.html | . |\n| 11/8/2006 7:52:51 | YourName | [[/|http://tiddlyspot.com/mptw_beta/]] | [[store.cgi|http://tiddlyspot.com/mptw_beta/store.cgi]] | . | index.html | . |\n| 18/8/2006 2:27:50 | YourName | [[/|http://mptw-beta.tiddlyspot.com/]] | [[store.cgi|http://mptw-beta.tiddlyspot.com/store.cgi]] | . | index.html | . | Ok |\n| 18/8/2006 2:33:53 | YourName | [[/|http://mptw-beta.tiddlyspot.com/]] | [[store.cgi|http://mptw-beta.tiddlyspot.com/store.cgi]] | . | index.html | . |\n| 18/8/2006 2:49:58 | YourName | [[/|http://mptw-beta.tiddlyspot.com/]] | [[store.cgi|http://mptw-beta.tiddlyspot.com/store.cgi]] | . | index.html | . |\n| 18/8/2006 2:51:21 | YourName | [[/|http://mptw-beta.tiddlyspot.com/]] | [[store.cgi|http://mptw-beta.tiddlyspot.com/store.cgi]] | . | index.html | . |\n| 18/8/2006 3:6:57 | YourName | [[/|http://mptw-beta.tiddlyspot.com/]] | [[store.cgi|http://mptw-beta.tiddlyspot.com/store.cgi]] | . | index.html | . |\n| 18/8/2006 3:22:33 | YourName | [[/|http://mptw-beta.tiddlyspot.com/#AutoPreFormat]] | [[store.cgi|http://mptw-beta.tiddlyspot.com/store.cgi]] | . | index.html | . | Ok |\n| 18/8/2006 3:24:11 | YourName | [[/|http://mptw-beta.tiddlyspot.com/#AutoPreFormat]] | [[store.cgi|http://mptw-beta.tiddlyspot.com/store.cgi]] | . | index.html | . |\n| 18/8/2006 9:49:42 | YourName | [[/|http://mptw-beta.tiddlyspot.com/]] | [[store.cgi|http://mptw-beta.tiddlyspot.com/store.cgi]] | . | index.html | . |\n| 20/8/2006 14:42:25 | Simon | [[mptw-beta.html|file:///D:/Documents%20and%20Settings/User/Desktop/mptw-beta.html]] | [[store.cgi|http://mptw-beta.tiddlyspot.com/store.cgi]] | . | index.html | . |\n| 20/8/2006 14:43:34 | YourName | [[index.html|http://mptw-beta.tiddlyspot.com/index.html]] | [[store.cgi|http://mptw-beta.tiddlyspot.com/store.cgi]] | . | index.html | . |\n| 21/8/2006 12:48:40 | YourName | [[/|http://mptw-beta.tiddlyspot.com/]] | [[store.cgi|http://mptw-beta.tiddlyspot.com/store.cgi]] | . | index.html | . |\n| 21/8/2006 12:50:6 | Simon | [[/|http://mptw-beta.tiddlyspot.com/]] | [[store.cgi|http://mptw-beta.tiddlyspot.com/store.cgi]] | . | index.html | . |\n| 21/8/2006 12:50:27 | Simon | [[/|http://mptw-beta.tiddlyspot.com/]] | [[store.cgi|http://mptw-beta.tiddlyspot.com/store.cgi]] | . | index.html | . | Ok |\n| 21/8/2006 12:54:54 | Simon | [[/|http://mptw-beta.tiddlyspot.com/]] | [[store.cgi|http://mptw-beta.tiddlyspot.com/store.cgi]] | . | index.html | . | Ok |\n| 21/8/2006 12:55:17 | Simon | [[/|http://mptw-beta.tiddlyspot.com/]] | [[store.cgi|http://mptw-beta.tiddlyspot.com/store.cgi]] | . | index.html | . |\n| 21/8/2006 12:55:49 | Simon | [[/|http://mptw-beta.tiddlyspot.com/]] | [[store.cgi|http://mptw-beta.tiddlyspot.com/store.cgi]] | . | index.html | . |\n| 21/8/2006 12:57:18 | Simon | [[/|http://mptw-beta.tiddlyspot.com/]] | [[store.cgi|http://mptw-beta.tiddlyspot.com/store.cgi]] | . | index.html | . |\n| 21/8/2006 13:9:28 | Simon | [[/|http://mptw-beta.tiddlyspot.com/]] | [[store.cgi|http://mptw-beta.tiddlyspot.com/store.cgi]] | . | index.html | . |\n| 21/8/2006 14:45:13 | YourName | [[mptw-beta.html|file:///C:/Documents%20and%20Settings/ccscb/Desktop/mptw-beta.html#ShowEventsMacro]] | [[store.cgi|http://mptw-beta.tiddlyspot.com/store.cgi]] | . | index.html | . |\n| 21/8/2006 14:47:2 | Simon | [[/|http://mptw-beta.tiddlyspot.com/#Event%20ShowEventsMacro%20EventsDemo]] | [[store.cgi|http://mptw-beta.tiddlyspot.com/store.cgi]] | . | index.html | . |\n| 21/8/2006 15:5:4 | Simon | [[/|http://mptw-beta.tiddlyspot.com/#Event%20ShowEventsMacro%20EventsDemo]] | [[store.cgi|http://mptw-beta.tiddlyspot.com/store.cgi]] | . | index.html | . | Ok |\n| 21/8/2006 15:8:5 | Simon | [[/|http://mptw-beta.tiddlyspot.com/#Event%20ShowEventsMacro%20EventsDemo]] | [[store.cgi|http://mptw-beta.tiddlyspot.com/store.cgi]] | . | index.html | . |\n| 21/8/2006 15:9:0 | Simon | [[/|http://mptw-beta.tiddlyspot.com/#Event%20ShowEventsMacro%20EventsDemo]] | [[store.cgi|http://mptw-beta.tiddlyspot.com/store.cgi]] | . | index.html | . |\n| 21/8/2006 15:9:32 | Simon | [[/|http://mptw-beta.tiddlyspot.com/#Event%20ShowEventsMacro%20EventsDemo]] | [[store.cgi|http://mptw-beta.tiddlyspot.com/store.cgi]] | . | index.html | . |\n| 21/8/2006 15:10:17 | Simon | [[/|http://mptw-beta.tiddlyspot.com/#Event%20ShowEventsMacro%20EventsDemo]] | [[store.cgi|http://mptw-beta.tiddlyspot.com/store.cgi]] | . | index.html | . |\n| 21/8/2006 15:11:9 | Simon | [[/|http://mptw-beta.tiddlyspot.com/#Event%20ShowEventsMacro%20EventsDemo]] | [[store.cgi|http://mptw-beta.tiddlyspot.com/store.cgi]] | . | index.html | . |\n| 4/9/2006 0:17:20 | YourName | [[/|http://mptw-beta.tiddlyspot.com/]] | [[store.cgi|http://mptw-beta.tiddlyspot.com/store.cgi]] | . | index.html | . |\n| 4/9/2006 0:17:28 | YourName | [[/|http://mptw-beta.tiddlyspot.com/]] | [[store.cgi|http://mptw-beta.tiddlyspot.com/store.cgi]] | . | index.html | . |\n| 4/9/2006 0:21:32 | YourName | [[/|http://mptw-beta.tiddlyspot.com/]] | [[store.cgi|http://mptw-beta.tiddlyspot.com/store.cgi]] | . | index.html | . | Ok |\n| 4/9/2006 0:25:6 | YourName | [[/|http://mptw-beta.tiddlyspot.com/]] | [[store.cgi|http://mptw-beta.tiddlyspot.com/store.cgi]] | . | index.html | . | Ok |\n| 4/9/2006 0:25:54 | YourName | [[/|http://mptw-beta.tiddlyspot.com/]] | [[store.cgi|http://mptw-beta.tiddlyspot.com/store.cgi]] | . | index.html | . | Ok |\n| 4/9/2006 0:28:6 | YourName | [[/|http://mptw-beta.tiddlyspot.com/]] | [[store.cgi|http://mptw-beta.tiddlyspot.com/store.cgi]] | . | index.html | . |\n| 4/9/2006 0:37:50 | YourName | [[mptw-beta.html|file:///D:/Documents%20and%20Settings/User/Desktop/mptw-beta.html]] | [[store.cgi|http://mptw-beta.tiddlyspot.com/store.cgi]] | . | index.html | . | Ok |\n| 4/9/2006 0:48:50 | YourName | [[mptw-beta.html|file:///D:/Documents%20and%20Settings/User/Desktop/mptw-beta.html]] | [[store.cgi|http://mptw-beta.tiddlyspot.com/store.cgi]] | . | index.html | . |\n| 5/9/2006 14:39:59 | YourName | [[/|http://mptw-beta.tiddlyspot.com/]] | [[store.cgi|http://mptw-beta.tiddlyspot.com/store.cgi]] | . | index.html | . |\n| 5/9/2006 14:40:15 | YourName | [[/|http://mptw-beta.tiddlyspot.com/]] | [[store.cgi|http://mptw-beta.tiddlyspot.com/store.cgi]] | . | index.html | . |\n| 5/9/2006 14:42:45 | YourName | [[/|http://mptw-beta.tiddlyspot.com/]] | [[store.cgi|http://mptw-beta.tiddlyspot.com/store.cgi]] | . | index.html | . |\n| 5/9/2006 14:44:0 | YourName | [[/|http://mptw-beta.tiddlyspot.com/]] | [[store.cgi|http://mptw-beta.tiddlyspot.com/store.cgi]] | . | index.html | . |\n| 5/9/2006 15:42:23 | YourName | [[/|http://mptw-beta.tiddlyspot.com/]] | [[store.cgi|http://mptw-beta.tiddlyspot.com/store.cgi]] | . | index.html | . |\n| 5/9/2006 15:47:42 | YourName | [[/|http://mptw-beta.tiddlyspot.com/]] | [[store.cgi|http://mptw-beta.tiddlyspot.com/store.cgi]] | . | index.html | . |\n| 5/9/2006 15:48:35 | YourName | [[/|http://mptw-beta.tiddlyspot.com/]] | [[store.cgi|http://mptw-beta.tiddlyspot.com/store.cgi]] | . | index.html | . |\n| 5/9/2006 15:49:32 | YourName | [[/|http://mptw-beta.tiddlyspot.com/]] | [[store.cgi|http://mptw-beta.tiddlyspot.com/store.cgi]] | . | index.html | . |\n| 5/9/2006 15:50:8 | YourName | [[/|http://mptw-beta.tiddlyspot.com/]] | [[store.cgi|http://mptw-beta.tiddlyspot.com/store.cgi]] | . | index.html | . |\n| 5/9/2006 15:51:5 | YourName | [[/|http://mptw-beta.tiddlyspot.com/]] | [[store.cgi|http://mptw-beta.tiddlyspot.com/store.cgi]] | . | index.html | . |\n| 5/9/2006 15:54:7 | YourName | [[/|http://mptw-beta.tiddlyspot.com/]] | [[store.cgi|http://mptw-beta.tiddlyspot.com/store.cgi]] | . | index.html | . |\n| 5/9/2006 15:54:48 | YourName | [[/|http://mptw-beta.tiddlyspot.com/]] | [[store.cgi|http://mptw-beta.tiddlyspot.com/store.cgi]] | . | index.html | . |\n| 5/9/2006 16:7:6 | YourName | [[/|http://mptw-beta.tiddlyspot.com/]] | [[store.cgi|http://mptw-beta.tiddlyspot.com/store.cgi]] | . | index.html | . | Ok |\n| 5/9/2006 16:11:31 | YourName | [[/|http://mptw-beta.tiddlyspot.com/]] | [[store.cgi|http://mptw-beta.tiddlyspot.com/store.cgi]] | . | index.html | . | Ok |\n| 5/9/2006 16:12:22 | YourName | [[/|http://mptw-beta.tiddlyspot.com/]] | [[store.cgi|http://mptw-beta.tiddlyspot.com/store.cgi]] | . | index.html | . | Ok |\n| 5/9/2006 16:12:46 | YourName | [[/|http://mptw-beta.tiddlyspot.com/]] | [[store.cgi|http://mptw-beta.tiddlyspot.com/store.cgi]] | . | index.html | . | Ok |\n| 5/9/2006 16:15:27 | YourName | [[/|http://mptw-beta.tiddlyspot.com/]] | [[store.cgi|http://mptw-beta.tiddlyspot.com/store.cgi]] | . | index.html | . | Ok |\n| 5/9/2006 16:15:45 | YourName | [[/|http://mptw-beta.tiddlyspot.com/]] | [[store.cgi|http://mptw-beta.tiddlyspot.com/store.cgi]] | . | index.html | . |\n| 5/9/2006 16:17:37 | YourName | [[/|http://mptw-beta.tiddlyspot.com/]] | [[store.cgi|http://mptw-beta.tiddlyspot.com/store.cgi]] | . | index.html | . |\n| 7/9/2006 9:5:54 | YourName | [[/|http://mptw-beta.tiddlyspot.com/#EventsDemo]] | [[store.cgi|http://mptw-beta.tiddlyspot.com/store.cgi]] | . | index.html | . |\n| 7/9/2006 19:58:49 | YourName | [[mptw-beta.html|file:///D:/Documents%20and%20Settings/User/Desktop/mptw-beta.html#Test]] | [[store.cgi|http://mptw-beta.tiddlyspot.com/store.cgi]] | . | index.html | . |\n| 7/9/2006 19:59:36 | YourName | [[mptw-beta.html|file:///D:/Documents%20and%20Settings/User/Desktop/mptw-beta.html#Test]] | [[store.cgi|http://mptw-beta.tiddlyspot.com/store.cgi]] | . | index.html | . | Ok |\n| 7/9/2006 20:1:2 | YourName | [[mptw-beta.html|file:///D:/Documents%20and%20Settings/User/Desktop/mptw-beta.html#Test]] | [[store.cgi|http://mptw-beta.tiddlyspot.com/store.cgi]] | . | index.html | . | Ok |\n| 7/9/2006 20:8:13 | YourName | [[mptw-beta.html|file:///D:/Documents%20and%20Settings/User/Desktop/mptw-beta.html#Test]] | [[store.cgi|http://mptw-beta.tiddlyspot.com/store.cgi]] | . | index.html | . |\n| 19/9/2006 16:2:26 | YourName | [[/|http://mptw-beta.tiddlyspot.com/]] | [[store.cgi|http://mptw-beta.tiddlyspot.com/store.cgi]] | . | index.html | . |\n| 19/9/2006 16:2:38 | YourName | [[/|http://mptw-beta.tiddlyspot.com/]] | [[store.cgi|http://mptw-beta.tiddlyspot.com/store.cgi]] | . | index.html | . | Ok |\n| 19/9/2006 16:3:6 | YourName | [[/|http://mptw-beta.tiddlyspot.com/]] | [[store.cgi|http://mptw-beta.tiddlyspot.com/store.cgi]] | . | index.html | . | Ok |\n| 19/9/2006 16:10:32 | YourName | [[/|http://mptw-beta.tiddlyspot.com/]] | [[store.cgi|http://mptw-beta.tiddlyspot.com/store.cgi]] | . | index.html | . | Ok |\n| 19/9/2006 16:17:46 | YourName | [[/|http://mptw-beta.tiddlyspot.com/]] | [[store.cgi|http://mptw-beta.tiddlyspot.com/store.cgi]] | . | index.html | . |\n| 20/9/2006 19:16:30 | YourName | [[/|http://mptw-beta.tiddlyspot.com/]] | [[store.cgi|http://mptw-beta.tiddlyspot.com/store.cgi]] | . | index.html | . | Ok |\n| 20/9/2006 19:33:2 | YourName | [[/|http://mptw-beta.tiddlyspot.com/#HideWhenMacro]] | [[store.cgi|http://mptw-beta.tiddlyspot.com/store.cgi]] | . | index.html | . |\n| 25/9/2006 9:46:5 | YourName | [[/|http://mptw-beta.tiddlyspot.com/]] | [[store.cgi|http://mptw-beta.tiddlyspot.com/store.cgi]] | . | index.html | . |\n| 25/9/2006 9:47:36 | YourName | [[/|http://mptw-beta.tiddlyspot.com/]] | [[store.cgi|http://mptw-beta.tiddlyspot.com/store.cgi]] | . | index.html | . |\n| 25/9/2006 10:1:44 | YourName | [[/|http://mptw-beta.tiddlyspot.com/#PackageAsShadowPlugin]] | [[store.cgi|http://mptw-beta.tiddlyspot.com/store.cgi]] | . | index.html | . |\n| 25/9/2006 10:2:51 | YourName | [[/|http://mptw-beta.tiddlyspot.com/#PackageAsShadowPlugin]] | [[store.cgi|http://mptw-beta.tiddlyspot.com/store.cgi]] | . | index.html | . |\n| 25/9/2006 10:5:57 | YourName | [[/|http://mptw-beta.tiddlyspot.com/#PackageAsShadowPlugin]] | [[store.cgi|http://mptw-beta.tiddlyspot.com/store.cgi]] | . | index.html | . |\n| 25/9/2006 10:6:48 | YourName | [[/|http://mptw-beta.tiddlyspot.com/#PackageAsShadowPlugin]] | [[store.cgi|http://mptw-beta.tiddlyspot.com/store.cgi]] | . | index.html | . |\n| 25/9/2006 10:7:11 | YourName | [[/|http://mptw-beta.tiddlyspot.com/#PackageAsShadowPlugin]] | [[store.cgi|http://mptw-beta.tiddlyspot.com/store.cgi]] | . | index.html | . |\n| 25/9/2006 10:23:4 | YourName | [[mptw-beta.html|file:///Z:/newtt/mptw-beta.html]] | [[store.cgi|http://mptw-beta.tiddlyspot.com/store.cgi]] | . | index.html | . | Ok |\n| 25/9/2006 10:28:5 | YourName | [[mptw-beta.html|file:///Z:/newtt/mptw-beta.html]] | [[store.cgi|http://mptw-beta.tiddlyspot.com/store.cgi]] | . | index.html | . | Ok |\n| 25/9/2006 10:29:34 | YourName | [[mptw-beta.html|file:///Z:/newtt/mptw-beta.html]] | [[store.cgi|http://mptw-beta.tiddlyspot.com/store.cgi]] | . | index.html | . |\n| 25/9/2006 10:34:50 | YourName | [[/|http://mptw-beta.tiddlyspot.com/#PackageAsShadowPlugin]] | [[store.cgi|http://mptw-beta.tiddlyspot.com/store.cgi]] | . | index.html | . |\n| 25/9/2006 10:44:15 | YourName | [[/|http://mptw-beta.tiddlyspot.com/#PackageAsShadowPlugin]] | [[store.cgi|http://mptw-beta.tiddlyspot.com/store.cgi]] | . | index.html | . |\n| 25/9/2006 10:45:32 | YourName | [[/|http://mptw-beta.tiddlyspot.com/#PackageAsShadowPlugin]] | [[store.cgi|http://mptw-beta.tiddlyspot.com/store.cgi]] | . | index.html | . |\n| 25/9/2006 10:52:12 | YourName | [[/|http://mptw-beta.tiddlyspot.com/]] | [[store.cgi|http://mptw-beta.tiddlyspot.com/store.cgi]] | . | index.html | . |\n| 25/9/2006 10:53:7 | YourName | [[/|http://mptw-beta.tiddlyspot.com/]] | [[store.cgi|http://mptw-beta.tiddlyspot.com/store.cgi]] | . | index.html | . |\n| 25/9/2006 10:55:57 | YourName | [[/|http://mptw-beta.tiddlyspot.com/]] | [[store.cgi|http://mptw-beta.tiddlyspot.com/store.cgi]] | . | index.html | . | Ok |\n| 25/9/2006 11:2:10 | YourName | [[/|http://mptw-beta.tiddlyspot.com/#TagglyTaggingPlugin]] | [[store.cgi|http://mptw-beta.tiddlyspot.com/store.cgi]] | . | index.html | . | Ok |\n| 25/9/2006 11:2:32 | YourName | [[/|http://mptw-beta.tiddlyspot.com/#TagglyTaggingPlugin]] | [[store.cgi|http://mptw-beta.tiddlyspot.com/store.cgi]] | . | index.html | . | Ok |\n| 25/9/2006 11:3:2 | YourName | [[/|http://mptw-beta.tiddlyspot.com/#TagglyTaggingPlugin]] | [[store.cgi|http://mptw-beta.tiddlyspot.com/store.cgi]] | . | index.html | . |\n| 26/9/2006 12:0:13 | YourName | [[/|http://mptw-beta.tiddlyspot.com/#PackageAsShadowPlugin]] | [[store.cgi|http://mptw-beta.tiddlyspot.com/store.cgi]] | . | index.html | . |\n| 26/9/2006 14:9:30 | YourName | [[/|http://mptw-beta.tiddlyspot.com/#PackageAsShadowPlugin]] | [[store.cgi|http://mptw-beta.tiddlyspot.com/store.cgi]] | . | index.html | . |\n| 26/9/2006 17:16:12 | YourName | [[/|http://mptw-beta.tiddlyspot.com/]] | [[store.cgi|http://mptw-beta.tiddlyspot.com/store.cgi]] | . | index.html | . |\n| 27/9/2006 9:11:22 | YourName | [[/|http://mptw-beta.tiddlyspot.com/]] | [[store.cgi|http://mptw-beta.tiddlyspot.com/store.cgi]] | . | index.html | . |\n| 27/9/2006 9:13:7 | YourName | [[/|http://mptw-beta.tiddlyspot.com/]] | [[store.cgi|http://mptw-beta.tiddlyspot.com/store.cgi]] | . | index.html | . | Ok |\n| 27/9/2006 9:48:52 | YourName | [[/|http://mptw-beta.tiddlyspot.com/]] | [[store.cgi|http://mptw-beta.tiddlyspot.com/store.cgi]] | . | index.html | . | Ok |\n| 27/9/2006 9:49:39 | YourName | [[/|http://mptw-beta.tiddlyspot.com/]] | [[store.cgi|http://mptw-beta.tiddlyspot.com/store.cgi]] | . | index.html | . |\n| 27/9/2006 9:54:20 | YourName | [[/|http://mptw-beta.tiddlyspot.com/#CrazyPalette]] | [[store.cgi|http://mptw-beta.tiddlyspot.com/store.cgi]] | . | index.html | . | Ok |\n| 27/9/2006 9:54:39 | YourName | [[/|http://mptw-beta.tiddlyspot.com/#CrazyPalette]] | [[store.cgi|http://mptw-beta.tiddlyspot.com/store.cgi]] | . | index.html | . |\n| 29/9/2006 1:44:25 | YourName | [[/|http://mptw-beta.tiddlyspot.com/]] | [[store.cgi|http://mptw-beta.tiddlyspot.com/store.cgi]] | . | index.html | . | Ok |\n| 29/9/2006 1:51:6 | YourName | [[/|http://mptw-beta.tiddlyspot.com/]] | [[store.cgi|http://mptw-beta.tiddlyspot.com/store.cgi]] | . | index.html | . |\n| 29/9/2006 13:48:42 | YourName | [[/|http://mptw-beta.tiddlyspot.com/]] | [[store.cgi|http://mptw-beta.tiddlyspot.com/store.cgi]] | . | index.html | . | Ok |\n| 29/9/2006 13:50:7 | YourName | [[/|http://mptw-beta.tiddlyspot.com/]] | [[store.cgi|http://mptw-beta.tiddlyspot.com/store.cgi]] | . | index.html | . |\n| 29/9/2006 13:54:17 | YourName | [[/|http://mptw-beta.tiddlyspot.com/]] | [[store.cgi|http://mptw-beta.tiddlyspot.com/store.cgi]] | . | index.html | . |\n| 29/9/2006 13:56:14 | YourName | [[/|http://mptw-beta.tiddlyspot.com/]] | [[store.cgi|http://mptw-beta.tiddlyspot.com/store.cgi]] | . | index.html | . | Ok |\n| 29/9/2006 14:4:19 | YourName | [[/|http://mptw-beta.tiddlyspot.com/]] | [[store.cgi|http://mptw-beta.tiddlyspot.com/store.cgi]] | . | index.html | . |\n| 29/9/2006 14:5:40 | YourName | [[/|http://mptw-beta.tiddlyspot.com/]] | [[store.cgi|http://mptw-beta.tiddlyspot.com/store.cgi]] | . | index.html | . | Ok |\n| 29/9/2006 14:6:35 | YourName | [[/|http://mptw-beta.tiddlyspot.com/]] | [[store.cgi|http://mptw-beta.tiddlyspot.com/store.cgi]] | . | index.html | . |\n| 29/9/2006 14:31:1 | YourName | [[mptw-beta.html|file:///Z:/newtt/mptw-beta.html]] | [[store.cgi|http://mptw-beta.tiddlyspot.com/store.cgi]] | . | index.html | . |\n| 29/9/2006 15:24:34 | YourName | [[mptw-beta.html|file:///Z:/newtt/mptw-beta.html]] | [[store.cgi|http://mptw-beta.tiddlyspot.com/store.cgi]] | . | index.html | . |\n| 29/9/2006 15:54:40 | YourName | [[/|http://mptw-beta.tiddlyspot.com/#DatePickerDemo]] | [[store.cgi|http://mptw-beta.tiddlyspot.com/store.cgi]] | . | index.html | . | Ok |\n| 29/9/2006 15:58:43 | YourName | [[/|http://mptw-beta.tiddlyspot.com/#DatePickerDemo]] | [[store.cgi|http://mptw-beta.tiddlyspot.com/store.cgi]] | . | index.html | . |\n| 29/9/2006 16:4:41 | YourName | [[/|http://mptw-beta.tiddlyspot.com/#DatePickerDemo]] | [[store.cgi|http://mptw-beta.tiddlyspot.com/store.cgi]] | . | index.html | . |\n| 10/12/2006 16:18:5 | YourName | [[/|http://mptw-beta.tiddlyspot.com/]] | [[store.cgi|http://mptw-beta.tiddlyspot.com/store.cgi]] | . | index.html | . |\n| 10/12/2006 16:18:46 | YourName | [[/|http://mptw-beta.tiddlyspot.com/]] | [[store.cgi|http://mptw-beta.tiddlyspot.com/store.cgi]] | . | index.html | . |\n| 10/12/2006 16:20:4 | YourName | [[/|http://mptw-beta.tiddlyspot.com/]] | [[store.cgi|http://mptw-beta.tiddlyspot.com/store.cgi]] | . | index.html | . |\n| 10/12/2006 16:20:19 | YourName | [[/|http://mptw-beta.tiddlyspot.com/]] | [[store.cgi|http://mptw-beta.tiddlyspot.com/store.cgi]] | . | index.html | . |\n| 10/12/2006 16:22:12 | YourName | [[/|http://mptw-beta.tiddlyspot.com/]] | [[store.cgi|http://mptw-beta.tiddlyspot.com/store.cgi]] | . | index.html | . |\n| 3/1/2007 15:18:1 | YourName | [[/|http://mptw-beta.tiddlyspot.com/#PackageAsShadowPlugin]] | [[store.cgi|http://mptw-beta.tiddlyspot.com/store.cgi]] | . | index.html | . |\n| 3/1/2007 15:18:12 | YourName | [[/|http://mptw-beta.tiddlyspot.com/#PackageAsShadowPlugin]] | [[store.cgi|http://mptw-beta.tiddlyspot.com/store.cgi]] | . | index.html | . |\n| 3/1/2007 15:18:22 | YourName | [[/|http://mptw-beta.tiddlyspot.com/#PackageAsShadowPlugin]] | [[store.cgi|http://mptw-beta.tiddlyspot.com/store.cgi]] | . | index.html | . |\n| 6/2/2007 14:45:27 | YourName | [[/|http://mptw-beta.tiddlyspot.com/]] | [[store.cgi|http://mptw-beta.tiddlyspot.com/store.cgi]] | . | index.html | . |\n| 6/2/2007 14:49:38 | YourName | [[/|http://mptw-beta.tiddlyspot.com/]] | [[store.cgi|http://mptw-beta.tiddlyspot.com/store.cgi]] | . | index.html | . | Ok |\n| 6/2/2007 14:50:49 | YourName | [[/|http://mptw-beta.tiddlyspot.com/]] | [[store.cgi|http://mptw-beta.tiddlyspot.com/store.cgi]] | . | index.html | . |\n| 6/2/2007 14:52:25 | YourName | [[/|http://mptw-beta.tiddlyspot.com/]] | [[store.cgi|http://mptw-beta.tiddlyspot.com/store.cgi]] | . | index.html | . |
/***\n<<tiddler UploadPluginDoc>>\n!Code\n***/\n//{{{\nversion.extensions.UploadPlugin = {\n major: 3, minor: 3, revision: 3, \n date: new Date(2006,6,30),\n type: 'macro',\n source: 'http://tiddlywiki.bidix.info/#UploadPlugin',\n docs: 'http://tiddlywiki.bidix.info/#UploadPluginDoc'\n};\n//}}}\n\n////+++!![config.lib.file]\n\n//{{{\nif (!config.lib) config.lib = {};\nif (!config.lib.file) config.lib.file= {\n author: 'BidiX',\n version: {major: 0, minor: 1, revision: 0}, \n date: new Date(2006,3,9)\n};\nconfig.lib.file.dirname = function (filePath) {\n var lastpos;\n if ((lastpos = filePath.lastIndexOf("/")) != -1) {\n return filePath.substring(0, lastpos);\n } else {\n return filePath.substring(0, filePath.lastIndexOf("\s\s"));\n }\n};\nconfig.lib.file.basename = function (filePath) {\n var lastpos;\n if ((lastpos = filePath.lastIndexOf("#")) != -1) \n filePath = filePath.substring(0, lastpos);\n if ((lastpos = filePath.lastIndexOf("/")) != -1) {\n return filePath.substring(lastpos + 1);\n } else\n return filePath.substring(filePath.lastIndexOf("\s\s")+1);\n};\nwindow.basename = function() {return "@@deprecated@@";};\n//}}}\n////===\n\n////+++!![config.lib.log]\n\n//{{{\nif (!config.lib) config.lib = {};\nif (!config.lib.log) config.lib.log= {\n author: 'BidiX',\n version: {major: 0, minor: 1, revision: 0}, \n date: new Date(2006,3,9)\n};\nconfig.lib.Log = function(tiddlerTitle, logHeader) {\n if (version.major < 2)\n this.tiddler = store.tiddlers[tiddlerTitle];\n else\n this.tiddler = store.getTiddler(tiddlerTitle);\n if (!this.tiddler) {\n this.tiddler = new Tiddler();\n this.tiddler.title = tiddlerTitle;\n this.tiddler.text = "| !date | !user | !location |" + logHeader;\n this.tiddler.created = new Date();\n this.tiddler.modifier = config.options.txtUserName;\n this.tiddler.modified = new Date();\n if (version.major < 2)\n store.tiddlers[tiddlerTitle] = this.tiddler;\n else\n store.addTiddler(this.tiddler);\n }\n return this;\n};\n\nconfig.lib.Log.prototype.newLine = function (line) {\n var now = new Date();\n var newText = "| ";\n newText += now.getDate()+"/"+(now.getMonth()+1)+"/"+now.getFullYear() + " ";\n newText += now.getHours()+":"+now.getMinutes()+":"+now.getSeconds()+" | ";\n newText += config.options.txtUserName + " | ";\n var location = document.location.toString();\n var filename = config.lib.file.basename(location);\n if (!filename) filename = '/';\n newText += "[["+filename+"|"+location + "]] |";\n this.tiddler.text = this.tiddler.text + "\sn" + newText;\n this.addToLine(line);\n};\n\nconfig.lib.Log.prototype.addToLine = function (text) {\n this.tiddler.text = this.tiddler.text + text;\n this.tiddler.modifier = config.options.txtUserName;\n this.tiddler.modified = new Date();\n if (version.major < 2)\n store.tiddlers[this.tiddler.tittle] = this.tiddler;\n else {\n store.addTiddler(this.tiddler);\n story.refreshTiddler(this.tiddler.title);\n store.notify(this.tiddler.title, true);\n }\n if (version.major < 2)\n store.notifyAll(); \n};\n//}}}\n////===\n\n////+++!![config.lib.options]\n\n//{{{\nif (!config.lib) config.lib = {};\nif (!config.lib.options) config.lib.options = {\n author: 'BidiX',\n version: {major: 0, minor: 1, revision: 0}, \n date: new Date(2006,3,9)\n};\n\nconfig.lib.options.init = function (name, defaultValue) {\n if (!config.options[name]) {\n config.options[name] = defaultValue;\n saveOptionCookie(name);\n }\n};\n//}}}\n////===\n\n////+++!![PasswordTweak]\n\n//{{{\nversion.extensions.PasswordTweak = {\n major: 1, minor: 0, revision: 2, date: new Date(2006,3,11),\n type: 'tweak',\n source: 'http://tiddlywiki.bidix.info/#PasswordTweak'\n};\n//}}}\n/***\n!!config.macros.option\n***/\n//{{{\nconfig.macros.option.passwordCheckboxLabel = "Save this password on this computer";\nconfig.macros.option.passwordType = "password"; // password | text\n\nconfig.macros.option.onChangeOption = function(e)\n{\n var opt = this.getAttribute("option");\n var elementType,valueField;\n if(opt) {\n switch(opt.substr(0,3)) {\n case "txt":\n elementType = "input";\n valueField = "value";\n break;\n case "pas":\n elementType = "input";\n valueField = "value";\n break;\n case "chk":\n elementType = "input";\n valueField = "checked";\n break;\n }\n config.options[opt] = this[valueField];\n saveOptionCookie(opt);\n var nodes = document.getElementsByTagName(elementType);\n for(var t=0; t<nodes.length; t++) {\n var optNode = nodes[t].getAttribute("option");\n if (opt == optNode) \n nodes[t][valueField] = this[valueField];\n }\n }\n return(true);\n};\n\nconfig.macros.option.handler = function(place,macroName,params)\n{\n var opt = params[0];\n var size = 15;\n if (params[1])\n size = params[1];\n if(config.options[opt] === undefined) {\n return;}\n var c;\n switch(opt.substr(0,3)) {\n case "txt":\n c = document.createElement("input");\n c.onkeyup = this.onChangeOption;\n c.setAttribute ("option",opt);\n c.size = size;\n c.value = config.options[opt];\n place.appendChild(c);\n break;\n case "pas":\n // input password\n c = document.createElement ("input");\n c.setAttribute("type",config.macros.option.passwordType);\n c.onkeyup = this.onChangeOption;\n c.setAttribute("option",opt);\n c.size = size;\n c.value = config.options[opt];\n place.appendChild(c);\n // checkbox link with this password "save this password on this computer"\n c = document.createElement("input");\n c.setAttribute("type","checkbox");\n c.onclick = this.onChangeOption;\n c.setAttribute("option","chk"+opt);\n place.appendChild(c);\n c.checked = config.options["chk"+opt];\n // text savePasswordCheckboxLabel\n place.appendChild(document.createTextNode(config.macros.option.passwordCheckboxLabel));\n break;\n case "chk":\n c = document.createElement("input");\n c.setAttribute("type","checkbox");\n c.onclick = this.onChangeOption;\n c.setAttribute("option",opt);\n place.appendChild(c);\n c.checked = config.options[opt];\n break;\n }\n};\n//}}}\n/***\n!! Option cookie stuff\n***/\n//{{{\nwindow.loadOptionsCookie_orig_PasswordTweak = window.loadOptionsCookie;\nwindow.loadOptionsCookie = function()\n{\n var cookies = document.cookie.split(";");\n for(var c=0; c<cookies.length; c++) {\n var p = cookies[c].indexOf("=");\n if(p != -1) {\n var name = cookies[c].substr(0,p).trim();\n var value = cookies[c].substr(p+1).trim();\n switch(name.substr(0,3)) {\n case "txt":\n config.options[name] = unescape(value);\n break;\n case "pas":\n config.options[name] = unescape(value);\n break;\n case "chk":\n config.options[name] = value == "true";\n break;\n }\n }\n }\n};\n\nwindow.saveOptionCookie_orig_PasswordTweak = window.saveOptionCookie;\nwindow.saveOptionCookie = function(name)\n{\n var c = name + "=";\n switch(name.substr(0,3)) {\n case "txt":\n c += escape(config.options[name].toString());\n break;\n case "chk":\n c += config.options[name] ? "true" : "false";\n // is there an option link with this chk ?\n if (config.options[name.substr(3)]) {\n saveOptionCookie(name.substr(3));\n }\n break;\n case "pas":\n if (config.options["chk"+name]) {\n c += escape(config.options[name].toString());\n } else {\n c += "";\n }\n break;\n }\n c += "; expires=Fri, 1 Jan 2038 12:00:00 UTC; path=/";\n document.cookie = c;\n};\n//}}}\n/***\n!! Initializations\n***/\n//{{{\n// define config.options.pasPassword\nif (!config.options.pasPassword) {\n config.options.pasPassword = 'defaultPassword';\n window.saveOptionCookie('pasPassword');\n}\n// since loadCookies is first called befor password definition\n// we need to reload cookies\nwindow.loadOptionsCookie();\n//}}}\n////===\n\n////+++!![config.macros.upload]\n\n//{{{\nconfig.macros.upload = {\n accessKey: "U",\n formName: "UploadPlugin",\n contentType: "text/html;charset=UTF-8",\n defaultStoreScript: "store.php"\n};\n\n// only this two configs need to be translated\nconfig.macros.upload.messages = {\n aboutToUpload: "About to upload TiddlyWiki to %0",\n errorDownloading: "Error downloading",\n errorUploadingContent: "Error uploading content",\n fileNotFound: "file to upload not found",\n fileNotUploaded: "File %0 NOT uploaded",\n mainFileUploaded: "Main TiddlyWiki file uploaded to %0",\n urlParamMissing: "url param missing",\n rssFileNotUploaded: "RssFile %0 NOT uploaded",\n rssFileUploaded: "Rss File uploaded to %0"\n};\n\nconfig.macros.upload.label = {\n promptOption: "Save and Upload this TiddlyWiki with UploadOptions",\n promptParamMacro: "Save and Upload this TiddlyWiki in %0",\n saveLabel: "save to web", \n saveToDisk: "save to disk",\n uploadLabel: "upload" \n};\n\nconfig.macros.upload.handler = function(place,macroName,params){\n // parameters initialization\n var storeUrl = params[0];\n var toFilename = params[1];\n var backupDir = params[2];\n var uploadDir = params[3];\n var username = params[4];\n var password; // for security reason no password as macro parameter\n var label;\n if (document.location.toString().substr(0,4) == "http")\n label = this.label.saveLabel;\n else\n label = this.label.uploadLabel;\n var prompt;\n if (storeUrl) {\n prompt = this.label.promptParamMacro.toString().format([this.dirname(storeUrl)]);\n }\n else {\n prompt = this.label.promptOption;\n }\n createTiddlyButton(place, label, prompt, \n function () {\n config.macros.upload.upload(storeUrl, toFilename, uploadDir, backupDir, username, password); \n return false;}, \n null, null, this.accessKey);\n};\nconfig.macros.upload.UploadLog = function() {\n return new config.lib.Log('UploadLog', " !storeUrl | !uploadDir | !toFilename | !backupdir | !origin |" );\n};\nconfig.macros.upload.UploadLog.prototype = config.lib.Log.prototype;\nconfig.macros.upload.UploadLog.prototype.startUpload = function(storeUrl, toFilename, uploadDir, backupDir) {\n var line = " [[" + config.lib.file.basename(storeUrl) + "|" + storeUrl + "]] | ";\n line += uploadDir + " | " + toFilename + " | " + backupDir + " |";\n this.newLine(line);\n};\nconfig.macros.upload.UploadLog.prototype.endUpload = function() {\n this.addToLine(" Ok |");\n};\nconfig.macros.upload.basename = config.lib.file.basename;\nconfig.macros.upload.dirname = config.lib.file.dirname;\nconfig.macros.upload.upload = function(storeUrl, toFilename, uploadDir, backupDir, username, password)\n{\n // parameters initialization\n storeUrl = (storeUrl ? storeUrl : config.options.txtUploadStoreUrl);\n toFilename = (toFilename ? toFilename : config.options.txtUploadFilename);\n backupDir = (backupDir ? backupDir : config.options.txtUploadBackupDir);\n uploadDir = (uploadDir ? uploadDir : config.options.txtUploadDir);\n username = (username ? username : config.options.txtUploadUserName);\n password = config.options.pasUploadPassword; // for security reason no password as macro parameter\n if (storeUrl === '') {\n config.macros.upload.defaultStoreScript;\n }\n if (config.lib.file.dirname(storeUrl) === '') {\n storeUrl = config.lib.file.dirname(document.location.toString())+'/'+storeUrl;\n }\n if (toFilename === '') {\n toFilename = config.lib.file.basename(document.location.toString());\n }\n\n clearMessage();\n // only for forcing the message to display\n if (version.major < 2)\n store.notifyAll();\n if (!storeUrl) {\n alert(config.macros.upload.messages.urlParamMissing);\n return;\n }\n \n var log = new this.UploadLog();\n log.startUpload(storeUrl, toFilename, uploadDir, backupDir);\n if (document.location.toString().substr(0,5) == "file:") {\n saveChanges();\n }\n displayMessage(config.macros.upload.messages.aboutToUpload.format([this.dirname(storeUrl)]), this.dirname(storeUrl));\n this.uploadChanges(storeUrl, toFilename, uploadDir, backupDir, username, password);\n if(config.options.chkGenerateAnRssFeed) {\n //var rssContent = convertUnicodeToUTF8(generateRss());\n var rssContent = generateRss();\n var rssPath = toFilename.substr(0,toFilename.lastIndexOf(".")) + ".xml";\n this.uploadContent(rssContent, storeUrl, rssPath, uploadDir, '', username, password, \n function (responseText) {\n if (responseText.substring(0,1) != '0') {\n displayMessage(config.macros.upload.messages.rssFileNotUploaded.format([rssPath]));\n }\n else {\n if (uploadDir) {\n rssPath = uploadDir + "/" + config.macros.upload.basename(rssPath);\n } else {\n rssPath = config.macros.upload.basename(rssPath);\n }\n displayMessage(config.macros.upload.messages.rssFileUploaded.format(\n [config.macros.upload.dirname(storeUrl)+"/"+rssPath]), config.macros.upload.dirname(storeUrl)+"/"+rssPath);\n }\n // for debugging store.php uncomment last line\n //DEBUG alert(responseText);\n });\n }\n return;\n};\n\nconfig.macros.upload.uploadChanges = function(storeUrl, toFilename, uploadDir, backupDir, \n username, password) {\n var original;\n if (document.location.toString().substr(0,4) == "http") {\n original = this.download(storeUrl, toFilename, uploadDir, backupDir, username, password);\n return;\n }\n else {\n // standard way : Local file\n \n original = loadFile(getLocalPath(document.location.toString()));\n if(window.Components) {\n // it's a mozilla browser\n try {\n netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");\n var converter = Components.classes["@mozilla.org/intl/scriptableunicodeconverter"]\n .createInstance(Components.interfaces.nsIScriptableUnicodeConverter);\n converter.charset = "UTF-8";\n original = converter.ConvertToUnicode(original);\n }\n catch(e) {\n }\n }\n }\n //DEBUG alert(original);\n this.uploadChangesFrom(original, storeUrl, toFilename, uploadDir, backupDir, \n username, password);\n};\n\nconfig.macros.upload.uploadChangesFrom = function(original, storeUrl, toFilename, uploadDir, backupDir, \n username, password) {\n var startSaveArea = '<div id="' + 'storeArea">'; // Split up into two so that indexOf() of this source doesn't find it\n var endSaveArea = '</d' + 'iv>';\n // Locate the storeArea div's\n var posOpeningDiv = original.indexOf(startSaveArea);\n var posClosingDiv = original.lastIndexOf(endSaveArea);\n if((posOpeningDiv == -1) || (posClosingDiv == -1))\n {\n alert(config.messages.invalidFileError.format([document.location.toString()]));\n return;\n }\n var revised = original.substr(0,posOpeningDiv + startSaveArea.length) + \n allTiddlersAsHtml() + "\sn\st\st" +\n original.substr(posClosingDiv);\n var newSiteTitle;\n if(version.major < 2){\n newSiteTitle = (getElementText("siteTitle") + " - " + getElementText("siteSubtitle")).htmlEncode();\n } else {\n newSiteTitle = (wikifyPlain ("SiteTitle") + " - " + wikifyPlain ("SiteSubtitle")).htmlEncode();\n }\n revised = revised.replace(new RegExp("<title>[^<]*</title>", "im"),"<title>"+ newSiteTitle +"</title>");\n var response = this.uploadContent(revised, storeUrl, toFilename, uploadDir, backupDir, \n username, password, function (responseText) {\n if (responseText.substring(0,1) != '0') {\n alert(responseText);\n displayMessage(config.macros.upload.messages.fileNotUploaded.format([getLocalPath(document.location.toString())]));\n }\n else {\n if (uploadDir !== '') {\n toFilename = uploadDir + "/" + config.macros.upload.basename(toFilename);\n } else {\n toFilename = config.macros.upload.basename(toFilename);\n }\n displayMessage(config.macros.upload.messages.mainFileUploaded.format(\n [config.macros.upload.dirname(storeUrl)+"/"+toFilename]), config.macros.upload.dirname(storeUrl)+"/"+toFilename);\n var log = new config.macros.upload.UploadLog();\n log.endUpload();\n store.setDirty(false);\n }\n // for debugging store.php uncomment last line\n //DEBUG alert(responseText);\n }\n );\n};\n\nconfig.macros.upload.uploadContent = function(content, storeUrl, toFilename, uploadDir, backupDir, \n username, password, callbackFn) {\n var boundary = "---------------------------"+"AaB03x"; \n var request;\n try {\n request = new XMLHttpRequest();\n } \n catch (e) { \n request = new ActiveXObject("Msxml2.XMLHTTP"); \n }\n if (window.netscape){\n try {\n if (document.location.toString().substr(0,4) != "http") {\n netscape.security.PrivilegeManager.enablePrivilege('UniversalBrowserRead');}\n }\n catch (e) { }\n } \n //DEBUG alert("user["+config.options.txtUploadUserName+"] password[" + config.options.pasUploadPassword + "]");\n // compose headers data\n var sheader = "";\n sheader += "--" + boundary + "\sr\snContent-disposition: form-data; name=\s"";\n sheader += config.macros.upload.formName +"\s"\sr\sn\sr\sn";\n sheader += "backupDir="+backupDir\n +";user=" + username \n +";password=" + password\n +";uploaddir=" + uploadDir\n + ";;\sr\sn"; \n sheader += "\sr\sn" + "--" + boundary + "\sr\sn";\n sheader += "Content-disposition: form-data; name=\s"userfile\s"; filename=\s""+toFilename+"\s"\sr\sn";\n sheader += "Content-Type: " + config.macros.upload.contentType + "\sr\sn";\n sheader += "Content-Length: " + content.length + "\sr\sn\sr\sn";\n // compose trailer data\n var strailer = new String();\n strailer = "\sr\sn--" + boundary + "--\sr\sn";\n var data;\n data = sheader + content + strailer;\n //request.open("POST", storeUrl, true, username, password);\n request.open("POST", storeUrl, true);\n request.onreadystatechange = function () {\n if (request.readyState == 4) {\n if (request.status == 200)\n callbackFn(request.responseText);\n else\n alert(config.macros.upload.messages.errorUploadingContent);\n }\n };\n request.setRequestHeader("Content-Length",data.length);\n request.setRequestHeader("Content-Type","multipart/form-data; boundary="+boundary);\n request.send(data); \n};\n\n\nconfig.macros.upload.download = function(uploadUrl, uploadToFilename, uploadDir, uploadBackupDir, \n username, password) {\n var request;\n try {\n request = new XMLHttpRequest();\n } \n catch (e) { \n request = new ActiveXObject("Msxml2.XMLHTTP"); \n }\n try {\n if (uploadUrl.substr(0,4) == "http") {\n netscape.security.PrivilegeManager.enablePrivilege("UniversalBrowserRead");\n }\n else {\n netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");\n }\n } catch (e) { }\n //request.open("GET", document.location.toString(), true, username, password);\n request.open("GET", document.location.toString(), true);\n request.onreadystatechange = function () {\n if (request.readyState == 4) {\n if(request.status == 200) {\n config.macros.upload.uploadChangesFrom(request.responseText, uploadUrl, \n uploadToFilename, uploadDir, uploadBackupDir, username, password);\n }\n else\n alert(config.macros.upload.messages.errorDownloading.format(\n [document.location.toString()]));\n }\n };\n request.send(null);\n};\n\n//}}}\n////===\n\n////+++!![Initializations]\n\n//{{{\nconfig.lib.options.init('txtUploadStoreUrl','store.php');\nconfig.lib.options.init('txtUploadFilename','');\nconfig.lib.options.init('txtUploadDir','');\nconfig.lib.options.init('txtUploadBackupDir','');\nconfig.lib.options.init('txtUploadUserName',config.options.txtUserName);\nconfig.lib.options.init('pasUploadPassword','');\nconfig.shadowTiddlers.UploadPluginDoc = "[[Full Documentation|http://tiddlywiki.bidix.info/l#UploadPluginDoc ]]\sn"; \n\n\n//}}}\n////===\n\n////+++!![Core Hijacking]\n\n//{{{\nconfig.macros.saveChanges.label_orig_UploadPlugin = config.macros.saveChanges.label;\nconfig.macros.saveChanges.label = config.macros.upload.label.saveToDisk;\n\nconfig.macros.saveChanges.handler_orig_UploadPlugin = config.macros.saveChanges.handler;\n\nconfig.macros.saveChanges.handler = function(place)\n{\n if ((!readOnly) && (document.location.toString().substr(0,4) != "http"))\n createTiddlyButton(place,this.label,this.prompt,this.onClick,null,null,this.accessKey);\n}\n\n//}}}\n////===
/***\n| Name:|ViewPalettePlugin|\n| Description:|Defines the viewPalette macro for use in ViewTemplate|\n| Version:|2.0.0|\n| Date:|26-Sep-2006|\n| Source:|http://mptw.tiddlyspot.com/#ViewPalettePlugin|\n| Author:|Simon Baird <simon.baird@gmail.com>|\n| CoreVersion:|2.1.x|\n***/\n//{{{\nmerge(config.macros,{\n viewPalette: {\n title: 'Palette Preview',\n handler: function(place,macroName,params,wikifier,paramString,tiddler) {\n var title = params[0] ? params[0] : tiddler.title; \n var colors = store.calcAllSlices(title);\n var keys = [];\n for (c in colors) keys.push(c);\n var output = '';\n var prefix;\n var lastPrefix;\n output += ""+\n //'<h2>'+this.title+'</h2>'+\n '<table align="right" cellspacing="0" style="border-collapse:collapse;"><tr>'+\n '<td style="border:1px solid #555;font-size:50%;padding:0 2em;background:'+colors[keys[0]]+'"> </td>'+\n '<td rowspan="'+keys.length+'">'+\n '<table cellspacing="0" style="border:1px solid #555;width:22em;background:%8;margin-left:2em;">'+\n '<tr><td colspan="2" style="font-size:120%;background:%0;width=200px;padding:1em;font-weight:bold;color:%1">'+\n 'TiddlyWiki'+\n '</td>'+\n '<td style="background:%0;font-size:90%;text-align:right;">'+\n '<span style="background:%4;margin-right:1em;padding:0 1em;">message</span>'+\n '</td>'+\n '</tr>'+\n '<tr>'+\n '<td rowspan="3" style="color:%0;vertical-align:top;padding:4px;">Hello<br/>Started<br/>Monkey</td>'+\n '<td style="padding:0.7em;color:%3;"><b style="color:%5;font-size:120%;">HelloThere</b><br/>'+\n 'Lorem ipsum <b style="color:%0">dolor</b> sit amet, consectetuer adipiscing elit. </td>'+\n '<td rowspan="3" style="vertical-align:top;font-size:80%;">search<br/>new tiddler<br/>options<br/>'+\n '<div style="background:%6;margin-top:0.5em;padding:2px;color:%7">'+\n '<span style="background:%7;color:%3;">Timeline</span> Tags</div>'+\n '<div style="background:%7;color:%0;padding:4px;">Ninja<br/>Dolphin<br/>FooBar<br/>BazQux</div>'+\n '</td>'+\n '</tr>'+\n '<tr>'+\n '<td style="padding:0.7em;color:%3;"><b style="color:%5;font-size:120%;">GettingStarted</b><br/>'+\n 'Proin vel felis vel ipsum <b style="color:%0">fermentum</b> eleifend. </td>'+\n '</tr>'+\n '<tr>'+\n '<td style="padding:0.7em;">'+\n '<span style="padding:0 2px;background:%9;color:3%;">error</span>'+\n '</td>'+\n '</tr>'+\n '</table>'+\n '</td>'+\n '</tr>';\n\n for (var i=1;i<keys.length;i++)\n output += '<tr><td style="border:1px solid #ccc;font-size:50%;padding:0 2em;background:'+colors[keys[i]]+'"> </td></tr>';\n\n output+= '</table>';\n \n wikify("<html>"+output.format([\n colors.PrimaryMid, //0\n colors.PrimaryPale, //1\n colors.PrimaryDark, //2\n colors.Foreground, //3\n colors.SecondaryMid, //4\n colors.SecondaryDark, //5\n colors.TertiaryMid, //6\n colors.TertiaryPale, //7\n colors.Background, //8\n colors.Error, //9\n ''])+"</html>",place);\n }\n }\n});\n\nsetStylesheet(''+\n '.viewPalette div { text-align:right; vertical-align:top; float:left; padding:2px; width:80px; height:50px; }\sn'+\n '.viewPalette div span { padding:0 0.5em;background:white; border:1px solid black; font-size:80%; }\sn'+\n '',"showPaletteStyles");\n\n//}}}\n\n
<!---\nName: MonkeyPirateViewTemplate\nSource: http://mptw.tiddlyspot.com/\n--->\n<!--{{{-->\n<div class='toolbar'>\n<!-- my custom contextual buttons -->\n<span style="padding-right:2em;">\n <span macro="showWhen tiddler.tags.contains('css')"><span macro="refreshDisplay"></span></span>\n <span macro="showWhen tiddler.tags.contains('palette')"><span macro="setPalette"></span></span>\n <span macro="showWhen tiddler.tags.contains('systemConfig')">\n <span macro="toggleTag systemConfigForce . force"></span>\n <span macro="toggleTag systemConfigDisable . disable"></span>\n </span>\n <span macro="showWhen config.macros.applyLayout && config.macros.applyLayout.isLayout(tiddler.title)">\n <span macro="applyLayout"></span>\n </span>\n <span macro="showWhen config.macros.applyLayoutItem && config.macros.applyLayoutItem.isLayoutItem(tiddler.title)">\n <span macro="applyLayoutItem"></span>\n </span>\n</span>\n<!-- the regular toolbar -->\n<span macro='toolbar closeTiddler closeOthers +editTiddler deleteTiddler undoChanges permalink references jump newHere newJournalHere'></span>\n<!--<span macro="newTiddler tag:{{tiddler.title}} label:'new here' "></span>-->\n</div>\n\n<div class="tagglyTagged" macro="tags"></div>\n\n<div>\n<span class='title' macro='view title'></span>\n<span macro="miniTag"></span>\n</div>\n\n\n<div class='subtitle'>\n <!-- <span macro='view modifier link'></span>, -->\n <span macro='view modified date [[DD-mmm-YY]]'></span>\n <!-- (<span macro='message views.wikified.createdPrompt'></span>\n <span macro='view created date [[DD-mmm-YY]]'></span>) -->\n</div>\n\n<div macro="showWhen tiddler.tags.contains('hasDate')" style="padding:0.5em;">\n<span style="padding:2px 0.5em; border:1px solid [[ColorPalette::TertiaryLight]];background-color:[[ColorPalette::TertiaryPale]]">Date: <span macro='viewDate startdate'></span></span>\n</div>\n\n<div macro="showWhen tiddler.tags.contains('Task')">[[TaskToolbar]]</div>\n<div macro="showWhen tiddler.tags.contains('Event')">[[EventView]]</div>\n\n<!-- using tagglyTagging and tagglyTagged instead of these two -->\n<!--\n<div class='tagging' macro='tagging'></div>\n<div class='tagged' macro='tags'></div>\n-->\n\n<div macro="showWhen tiddler.tags.contains('palette')" style="width:1%;float:right;padding-top:1em;"><div macro="viewPalette"></div></div>\n\n<div macro="hideWhen tiddler.tags.containsAny(['css','html','pre','systemConfig'])&&!tiddler.text.match('{{'+'{')">\n <div class='viewer' macro='view text wikified'></div>\n</div>\n<div macro="showWhen tiddler.tags.containsAny(['css','html','pre','systemConfig'])&&!tiddler.text.match('{{'+'{')">\n <div class='viewer'><pre macro='view text'></pre></div>\n</div>\n\n<div class="tagglyTagging" macro="tagglyTagging"></div>\n\n<div class='tagClear'></div>\n<!--}}}-->\n
!THIS IS OLD AND BASED ON AN OLD TW CORE (ie the 2.1 beta)\n\n!!Start with http://mptw.tiddlyspot.com/empty.html not this file.\n\nTake a look in [[Plugins]] and [[Demos]].\n\nEverything here is either not finished or not documented properly. Use at own risk. For the stable core of MTPW see http://mptw.tiddlyspot.com/\n\nImportant stuff:\n|EventsDemo|It's the start of something that could become a very nice scheduler/calendar/reminder system for TW using tiddler fields|\n|PalettesDemo|A fun palette switcher that I should really write some docs for and rehome|\n|UndoChanges|Experimental single level undo for tiddler edits|\n|DatePickerDemo|Just a proof of concept datepicker (would be used with scheduler system)|\n\nOther [[Plugins|systemConfig]] are probably out-of-date versions of the ones at http://mptw.tiddlyspot.com so don't use them.
/*{{{*/\n.tagglyTagged li.listTitle { display:none;}.tagglyTagged li { display: inline; font-size:90%; }.tagglyTagged ul { margin:0px; padding:0px; }.tagglyTagging { padding-top:0.5em; }.tagglyTagging li.listTitle { display:none; }.tagglyTagging ul { margin-top:0px; padding-top:0.5em; padding-left:2em; margin-bottom:0px; padding-bottom:0px;}.tagglyTagging { vertical-align: top; margin:0px; padding:0px; }.tagglyTagging table { margin:0px; padding:0px; }.tagglyTagging .button { display:none; margin-left:3px; margin-right:3px; }.tagglyTagging .button, .tagglyTagging .hidebutton { color:[[ColorPalette::TertiaryLight]]; font-size:90%; border:0px; padding-left:0.3em;padding-right:0.3em;}.tagglyTagging .button:hover, .hidebutton:hover { background:[[ColorPalette::TertiaryPale]]; color:[[ColorPalette::TertiaryDark]];}.selected .tagglyTagging .button { display:inline;}.tagglyTagging .hidebutton { color:[[ColorPalette::Background]]; }.selected .tagglyTagging .hidebutton { color:[[ColorPalette::TertiaryLight]] }.tagglyLabel { color:[[ColorPalette::TertiaryMid]]; font-size:90%; }.tagglyTagging ul {padding-top:0px; padding-bottom:0.5em; margin-left:1em; }.tagglyTagging ul ul {list-style-type:disc; margin-left:-1em;}.tagglyTagging ul ul li {margin-left:0.5em; }.editLabel { font-size:90%; padding-top:0.5em; }.tagglyTagging .commas { padding-left:1.8em; }\n/*}}}*/
Edit this tiddler then click undo.\n...\nUndo will even work if you rename or change the tags.\n...\nSee UndoChangesPlugin.